为什么时钟块不阻塞?
Why Clocking block is not blocking?
使用时钟块作为阻塞语句对接口信号进行背靠背分配,但未按预期工作。
对于下面的代码,我希望设置为 1,但没有设置
结果:
在时间 95: 设置为 1
然后不等待时钟块,在时间戳 95 处,移动到下一条语句以设置 0。
需要这方面的帮助
interface intf(input clk);
logic done;
clocking smp_cb @(posedge clk);
endclocking
endinterface
module top;
bit clk;
always #5 clk =~clk;
intf intf_inst(.*);
initial begin
repeat(10)@(posedge clk);
$display("[%0t] set 1", $realtime);
assign_intf(1);
$display("[%0t] set 0", $realtime);
assign_intf(0);
//$display("[%0t] set 1", $realtime);
//assign_intf(1);
//$display("[%0t] set 0", $realtime);
//assign_intf(0);
repeat(10)@(posedge clk);
$stop;
end
task assign_intf(logic val);
intf_inst.done <= val;
@( intf_inst.smp_cb);
//@(posedge intf_inst.clk);
endtask
initial $monitor(" Monitor: [%0t] done_sig value %0d", $realtime, intf_inst.done);
endmodule
你的问题是你不应该在同一个进程中混合事件控制 @(posedge clk)
和时钟块事件 @(intf_inst.smp_cb)
。如果您打算使用时钟块,那么您与信号的唯一交互应该是通过时钟块。否则,您最终会遇到 raw 信号和时钟块信号之间的竞争条件。
在您的示例中,两个事件同时触发,但不是同时触发。在您调用 assign_intf 任务时,时钟块事件尚未触发。
使用时钟块作为阻塞语句对接口信号进行背靠背分配,但未按预期工作。
对于下面的代码,我希望设置为 1,但没有设置
结果:
在时间 95: 设置为 1
然后不等待时钟块,在时间戳 95 处,移动到下一条语句以设置 0。
需要这方面的帮助
interface intf(input clk);
logic done;
clocking smp_cb @(posedge clk);
endclocking
endinterface
module top;
bit clk;
always #5 clk =~clk;
intf intf_inst(.*);
initial begin
repeat(10)@(posedge clk);
$display("[%0t] set 1", $realtime);
assign_intf(1);
$display("[%0t] set 0", $realtime);
assign_intf(0);
//$display("[%0t] set 1", $realtime);
//assign_intf(1);
//$display("[%0t] set 0", $realtime);
//assign_intf(0);
repeat(10)@(posedge clk);
$stop;
end
task assign_intf(logic val);
intf_inst.done <= val;
@( intf_inst.smp_cb);
//@(posedge intf_inst.clk);
endtask
initial $monitor(" Monitor: [%0t] done_sig value %0d", $realtime, intf_inst.done);
endmodule
你的问题是你不应该在同一个进程中混合事件控制 @(posedge clk)
和时钟块事件 @(intf_inst.smp_cb)
。如果您打算使用时钟块,那么您与信号的唯一交互应该是通过时钟块。否则,您最终会遇到 raw 信号和时钟块信号之间的竞争条件。
在您的示例中,两个事件同时触发,但不是同时触发。在您调用 assign_intf 任务时,时钟块事件尚未触发。