以下示例代码。
我总是使用if \ else。每个部分都有自己的延迟 - X \ Y. 我的问题是电路是否进入'如果'并开始计算' X'延迟,然后异步事件进入'否则'它仍然记得' X'延迟而不是计算' Y'延迟。 [' X' >> ' Y'] '如果'和'其他'处理相同信号的部分[下面的sigA]。
我的问题是,如何验证异步事件可以清除延迟' X'然后开始其他'延迟操作' Y&#39 ;? 尝试阻止分配和另一个硬件技巧[MUX在外面]。但模拟器只能记住长时间的延迟。 我试图避免过度设计这样的逻辑始终[总是*]和计数状态机,但使用延迟操作符。
感谢。
always @(event)
begin
if (event)
/#X;
sigA <= value1;
end //end if
else
begin
/#Y;
sigA <= value2;
end //else
end //always***
答案 0 :(得分:0)
如果verilog在always块中遇到延迟,它将停止执行它,并且在清除延迟之前不会尝试任何新的执行。
所以,你的'else'部分只能在'then'部分的延迟被清除后执行。
以下是试验
的示例module a;
reg [3:0] v1, v2;
reg clk;
integer i ;
initial begin #7 v1 = 1; end
initial begin
$display ("hello");
clk = 0;
v1 = 0;
v2 = 0;
for(i = 0; i < 20; i++)
#2 clk = ~clk;
$finish;
end
always @(clk)
begin
$display ("%3t starting the block, clk=%b", $time, clk);
if (v1)
begin
#6 v1 = ~v1;
$display ("%3t assignment is done", $time);
end
else
begin
$display ("%3t else hello", $time);
#12 v1 = ~v2;
$display ("%3t else is done", $time);
end
end // always @ (clk)
endmodule // a
结果:
$ ./a
hello
0 starting the block, clk=0
0 else hello
12 else is done
12 starting the block, clk=0
18 assignment is done
18 starting the block, clk=1
18 else hello
30 else is done
30 starting the block, clk=1
36 assignment is done
36 starting the block, clk=0
36 else hello$ ./a