task monitorPush();
begin
bit [7:0] data = 0;
while (1) begin
@ (posedge intf.clk);
if (intf.cb.wr_cs== 1 && intf.cb.wr_en== 1) begin
// @ (posedge intf.clk);
data = intf.data_in;
sb.addItem(data);
$write("%dns : Write posting to scoreboard data = %x\n",$time, data);
end
end
end
endtask上面的代码和下面的代码有什么不同?例如,将后边缘时钟从第5行移动到第7行是如何改变代码的?提前感谢
task monitorPush();
begin
bit [7:0] data = 0;
while (1) begin
// @ (posedge intf.clk);
if (intf.cb.wr_cs== 1 && intf.cb.wr_en== 1) begin
@ (posedge intf.clk);
data = intf.data_in;
sb.addItem(data);
$write("%dns : Write posting to scoreboard data = %x\n",$time, data);
end
end
end
endtask发布于 2012-08-03 17:42:13
@(posedge intf.clk)等待时钟的后边缘,然后继续执行。
代码的版本1等待clk (posedge),然后执行if语句。
版本2:在if语句失败的情况下,将在while true块内连续执行,直到if变为true,然后等待clk posedge。
发布于 2014-12-10 14:28:30
在版本2中,您有可能陷入无限循环,因为模拟器将在计算while循环和if语句时卡住,并且不会切换到执行代码的其他部分。在版本1中,@(posedge intf.clk)会让模拟器跳转到代码的其他部分。简而言之,使用版本1。
发布于 2018-08-31 13:12:16
版本2)将挂起您的模拟,因为您没有if的else条件。从调用monitor函数的那一刻起,第一次遇到wr_cs/wr_en为零将陷入while(1)无限循环,因为没有else条件,也没有任何计时事件。
版本1是正确的使用方式。大多数时候,你的控制和数据信号会随着时钟的变化而改变。
在版本1)中,当CS/WEN变高时,您将在时钟边沿上采样计分板的数据
https://stackoverflow.com/questions/11789771
复制相似问题