关于verilog中两个always的关系问题

module pinlvji(clk,datain,reset,enclk,outdata);
input clk,datain,reset,enclk;
output [9:0]outdata;
reg [9:0]outdata;
reg [9:0]tep;
always @(posedge datain or posedge reset)
begin
if(reset)
tep<=0;
else if(enclk)
begin
tep<=tep+1;

end
else if(!enclk)
tep<=0;

end
always @(negedge enclk or posedge reset)
begin
if(reset)
outdata<=0;
else
outdata<=tep;
end
endmodule
可以看到第一个always中有这么一句
if(!enclk)
tep<=0;
而第二个always中
always @(negedge enclk or posedge reset)
用enclk做了下降沿,并且把tep的值赋给了outdata,那么tep<=0,先执行,还是outdata<=tep现执行呢?这两个差别太大了,求高手指点,我现在对两个always中的数据谁先谁后执行快崩溃了,各位帮帮忙吧,谢谢啦!

第一个always块中把enclk当成普通信号而把datain当时钟信号,第二个always块中把enclk当时钟信号,这在一般的设计当中是不允许的。如果非要这样用,则因为有多个时钟,需要特别做同步处理,否则做成的硬件不能正常工作。追问

不知道怎么回事,仿真的结果是正确的。那么对于我这个问题该怎么改正呢?

追答

你说仿真是正确的,一定是你仿真的test case不全面,只仿到了其中的一种情况,覆盖率太低。简单地说,就是你碰巧把你想像的情况仿出来了,而实际上电路的输入信号是随机的。建议你先把设计改成只有一个时钟再说吧。

温馨提示:内容为网友见解,仅供参考
第1个回答  2012-05-14
先避开硬件电路的实现不谈,只谈语法:
首先,你先不用管谁先执行,谁后执行,先弄清楚两个always语句是什么情况下执行的
那么,知道了这两个always语句是什么情况下执行,基本也就知道了你想要的先后顺序
---------------
既然你的仿真结果是正确的,那你应该可以从波形上看到执行的先后顺序呀??
第2个回答  2012-05-07
最好把这些写在一个always里面,用个状态机就搞定
第3个回答  2019-01-10
稳定的,你在第一个always里给那个变量赋值,这个变量从时钟上升沿到真正值的变化会有一个tco的时间,这个你应该懂的吧,这个tco加上布线延时的时间会比保持时间th长,所以你在第二个always里用if来判断变量的值做不同的处理是没有问题的。
相似回答