verilog何时使用当前时隙的值,何时使用前一时隙的值?
下面是一个简短的示例代码,这让我很困惑。在verilog进程中,使用当前或以前模拟时隙中的值的规则是什么verilog何时使用当前时隙的值,何时使用前一时隙的值?,verilog,simulation,Verilog,Simulation,下面是一个简短的示例代码,这让我很困惑。在verilog进程中,使用当前或以前模拟时隙中的值的规则是什么 module test(); reg clk, rst, r1, r2, r3; initial begin clk = 0; rst = 0; r1 = 0; r2 = 0; r3 = 0; @(posedge clk) rst = 1; end /
module test();
reg clk, rst, r1, r2, r3;
initial begin
clk = 0;
rst = 0;
r1 = 0;
r2 = 0;
r3 = 0;
@(posedge clk)
rst = 1;
end // initial
always #5 begin : clkgen
clk = ~clk;
end
/** TESTS **/
// PREVIOUS
always @(posedge clk) begin : proc_non_block
r1 = rst;
end
// CURRENT
always @(posedge clk or posedge rst) begin : proc_async
r2 <= rst;
end
// PREVIOUS
always @(posedge clk or negedge rst) begin : proc_async_neg
r3 <= rst;
end
endmodule // test
模块测试();
注册时钟、rst、r1、r2、r3;
初始开始
clk=0;
rst=0;
r1=0;
r2=0;
r3=0;
@(posedge clk)
rst=1;
完//首字母
始终#5开始:clkgen
clk=~clk;
结束
/**测验**/
//先前的
始终@(posedge clk)开始:过程非块
r1=rst;
结束
//当前
始终@(posedge clk或posedge rst)开始:过程异步
r2Verilog始终使用变量的当前值。此问题是在进行赋值时更新当前值时出现的。由于您在clk
的posedge
上解锁的进程中使用阻塞分配写入rst
,因此存在与其他块的竞争条件,这些块也在clk的posedge
上解锁。对于每个始终
进程解除阻塞的时间,与初始
进程解除阻塞分配给rst的时间,没有定义顺序。因此,当您获得
rst`的_old_值时,它会出现,因为赋值尚未发生
一般规则是:每当一个进程写入一个变量,而另一个进程读取同一个变量,并且所有进程都同步到同一个时钟事件时,对该变量使用非阻塞赋值 Verilog始终使用变量的当前值。此问题是在进行赋值时更新当前值时出现的。由于您在clk
的posedge
上解锁的进程中使用阻塞分配写入rst
,因此存在与其他块的竞争条件,这些块也在clk的posedge
上解锁。对于每个始终
进程解除阻塞的时间,与初始
进程解除阻塞分配给rst的时间,没有定义顺序。因此,当您获得
rst`的_old_值时,它会出现,因为赋值尚未发生
一般规则是:每当一个进程写入一个变量,而另一个进程读取同一个变量,并且所有进程都同步到同一个时钟事件时,对该变量使用非阻塞赋值 我认为结果与作业类型无关。使用阻塞或非阻塞分配也会有相同的结果。(非阻塞赋值仅涉及同一块中的以下表达式)您的信息错误。看见andhttps://www.ece.cmu.edu/~ece447/s13/lib/exe/fetch.php?media=synth-verilog-cummins.pdfI认为结果与赋值类型无关。使用阻塞或非阻塞分配也会有相同的结果。(非阻塞赋值仅涉及同一块中的以下表达式)您的信息错误。看见andhttps://www.ece.cmu.edu/~ece447/s13/lib/exe/fetch.php?media=synth-verilog-cummins.pdf