Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
verilog何时使用当前时隙的值,何时使用前一时隙的值?_Verilog_Simulation - Fatal编程技术网

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 /

下面是一个简短的示例代码,这让我很困惑。在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 // 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