【问题标题】:Which value will be used in an always block?在 always 块中将使用哪个值?
【发布时间】:2017-03-02 14:07:47
【问题描述】:

这是一个verilog代码:(此代码不用于综合)

`timescale 1 ns / 1 ns

module test;
    reg r1, r2, r3, r4;
    reg clk_at_time, clk_from_clk;


    // Initialize signals 
    initial begin
      r1 <= 1;
      r2 <= 0;
      clk_at_time <= 1;
      #200
      $finish();
    end


    // Generating simple a clock (period time is 10ns)  (as expected)
    always #5
        clk_at_time <= ~clk_at_time;


    // Generating a clock based on the clk_at_time.
    // This clk_from_clk is always equals the clk_at_time (as expected)
    always @ clk_at_time
        clk_from_clk <= clk_at_time;


    // r1 and r2 inverted at all posedge event. (as expected)
    // r3 is constant 0 (as expected)
    always @(posedge clk_at_time) begin
        r1 <= r2;
        r2 <= r1;
        r3 <= clk_from_clk;
    end


    // r4 is constant 1  ???!!!??? HOW ???!!!???
    always @(posedge clk_from_clk) begin
        r4 <= clk_at_time;
    end

endmodule

以及仿真的波形:

代码中有两个时钟:第一个是由时间生成的传统时钟always #5 第二个是由这个时钟生成的always @ clk_at_time 这两个时钟总是相等的(如预期的那样)

奇怪的是,如果我在 clk_at_time 的块中使用 clk_from_clk,之前的值将被使用 clk_from_clk。 (好的),但是如果我在 clk_from_clk 的块中使用 clk_at_time,则新值将用于 clk_at_time。

编辑

澄清: 查看波形:clk_from_clkclk_at_time 始终相等。

见代码:r3r4 是模拟的:

  • r3clk_at_time 的块中,由clk_from_clk 驱动
  • r4clk_from_clk 的块中,由clk_at_time 驱动

所以如果clk_from_clkclk_at_time 真的相同,r3r4 应该总是相等的。但请看波形:r3 始终为 0,r4 始终为 1

怎么样?规则是什么?

【问题讨论】:

  • 奇怪的是,如果我在 clk_at_time 的块中使用 clk_from_clk,之前的值将被 clk_from_clk 使用。 (好的),但是如果我在 clk_from_clk 的块中使用 clk_at_time,那么新值将用于 clk_at_time。 什么?你是说用always @(posedge clk_at_time) 代替always @(posedge clk_from_clk) 吗?请您编辑您的问题以使其更清楚吗?
  • 你能把你的问题说得更清楚吗?还要更改clk_from_clkclk_at_time 的名称,因为它们彼此非常混淆。
  • 我在Electronics StackExchange 回答了您同样的问题。通常建议通知 StackExchange 网络内的交叉帖子。

标签: verilog hdl


【解决方案1】:

我不知道确切的答案,但我想分享一个观点,从模拟的角度思考。我将其写为答案而不是评论,因为它不适合 cmets。

我认为这与模拟的有限元分析性质有关。在仿真的每个时间步,仿真器逐个组件地求解电路组件。而且由于您的clk_from_clk 是从clk_at_time 派生的,因此模拟器将始终首先评估后者。

r4clk_from_clk 之后评估,因此它的值始终为1。至于r3,它将在clk_at_time 的变化处评估并与clk_from_clk 同时进行评估,并具有其先前的价值。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-05-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-23
    相关资源
    最近更新 更多