代码之家  ›  专栏  ›  技术社区  ›  betontalpfa

verilog何时使用当前时隙和上一时隙的值?

  •  0
  • betontalpfa  · 技术社区  · 6 年前

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

    这是模拟的结果。(魁斯塔西姆10.4c) Sumulation result (Questasim 10.4C)

    上面的实验表明,只有当给定信号在当前模拟时隙处具有活动事件时,才使用给定信号的当前值。我说的对吗?有什么细节吗?

    1 回复  |  直到 6 年前
        1
  •  2
  •   dave_59    6 年前

    Verilog 总是 使用变量的当前值。此问题是在进行赋值时更新当前值的时间。自从你写信给 rst 在一个进程中使用阻塞分配,该进程在 posedge 属于 clk ,有一个竞争条件,其他块也在 上升沿 CLK的没有定义何时 always 相对于 Initial 进程取消阻止将其分配给 rst . So it appears as you get the _old_ value of 因为任务还没完成。

    一般规则是:每当一个进程写入一个变量,而另一个进程读取同一个变量,并且所有进程都同步到同一个时钟事件时,对该变量使用非阻塞分配。