一位同学反映,他设计的状态机使用Synplify综合和XST(Xilinx Synthesis Technology,是Xilinx ISE内嵌的综合工具)综合的结果不一致。对Synplify的综合结果布局布线后上板调试完全正确;而对XST的综合结果布局布线后上板调试发现了错误。所以他认为XST的综合结果有误,并询问为什么XST会综合出错误的结果。在帮助他解决这个疑问后,发现其中涉及的许多问题很具代表性,所以和大家一起分析一下这个疑问,希望对朋友们的设计有参考价值。下面是这位同学设计的状态机源代码:
module RxState (Reset_b,RxClk,Rx4bit,RxDV,CurrentState);
//port declare
input Reset_b,RxClk,RxDV;
input [3:0] Rx4bit;
output [2:0] CurrentState;
// wire declare
wire RXDEQD = Rx4bit == 4'hd;
wire RXDEQ5 = Rx4bit == 4'h5;
parameter [2:0]
IDLE = 3'H0,
PREAMBLE = 3'H1,
SFD = 3'H2,
DATA0 = 3'H3,
DATA1 = 3'H4,
DROP = 3'H5;
// Rx State machine
reg [2:0] CurrentState,NextState;
always @( posedge RxClk or negedge Reset_b)
begin if(!Reset_b)
CurrentState <= DROP;
else CurrentState <= NextState;
end
always @( CurrentState or RxDV or RXDEQ5 or RXDEQD)
begin
case(CurrentState)
IDLE : if(RxDV ) NextState <= PREAMBLE;
PREAMBLE: if(RXDEQ5) NextState <= SFD;
SFD :
begin
if(RXDEQD)
NextState <= DATA0;
end
DATA0 : NextState <= DATA1;
DATA1 :
begin
NextState <= DATA0;
if(!RxDV) NextState <= IDLE;
end
DROP : if(!RxDV) NextState <= IDLE;
default : NextState <= IDLE;
endcase
end endmodule
其设计是一个数据通讯中同步接收装置的状态机,当“Reset_b”复位后,进入“DROP”状
态;当接收指示信号“RXDV”有效后,从“IDLE”状态进入接收前缀信号状态“PREAMBLE”;当控制信号“RxDEQ5”有效后进入“SFD”状态接收一些指示关键字;当控制信号“RxDEQ”有效时,进入数据接收状态“DATA0”;接收完“DATA0”后接收“DATA1”,直到接收指示信号“RxDV”无效,返回到“IDLE”状态。
[此贴子已经被作者于2008-1-18 17:41:28编辑过]
1、关于latch 从程序看,我觉得文中的程序是一个网口收帧的程序,像这样的程序,完全可以通过全同步电路完成,不需要使用组合进程,我个人认为组合进程是最难把握的,最容易出现纰漏。 源程序综合后出现了latch,大家都很忌讳latch,但有的时候latch无法避免,比如说一个状态机有1和2两个状态,要求在1状态时条件满足就进入2,否则就还是2。那么使用组合进程的话latch就不可避免,否则结果可能就不对了。
2、关于敏感信号列表 很多综合器根本就不睬敏感信号列表,写不写综合结果都一样,顶多给个warning,这
样的话许多组合进程的程序综合后的结果和设想的天差地别,但是假如使用的是时序电路的话由于时钟的关系结果还会和设想的一致
3、关于冒险竞争 文中有一段程序被作者认为是冒险竞争,但是我试了一下(XST和Synplify),并没有出现这样的情况,signal总是在process结束的时候被统一赋值的,而且假如signal有多个赋值语句的话是以最后一句为准的,所以我认为不会有冒险竞争 westor: 1、latch是应该避免,而且从代码看出,这个学员本身还是希望用同步时序实现的,关键是
[此贴子已经被作者于2008-1-18 18:07:39编辑过]
欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/) | Powered by Discuz! 7.0.0 |