【问题标题】:Verilog: one clock cycle delay using registerVerilog:使用寄存器延迟一个时钟周期
【发布时间】:2017-05-22 10:08:05
【问题描述】:

我正在尝试延迟两个信号。我写了一个寄存器来做到这一点并实例化它,但发生了一件奇怪的事情。延迟“状态”信号似乎有效,但延迟“nb_bits”信号无效。

这是我的注册代码:

`timescale 1ns / 1ps

module register(
    input CLK,
    input clr,
    input en,
    input [7:0] in,
    output [7:0] out
    );

    reg [7:0] temp;

    always @ (posedge CLK or posedge clr) begin
        if (clr) begin
            temp <= 8'b00010000;
        end
        else if (en) begin
            temp <= in;
        end
        else begin
            temp <= temp;
        end
    end

    assign out = temp;

endmodule

这就是实例化:

wire [3:0] nbb;
nb_bits_register nb_bits_reg(
    .CLK(CLK),
    .clr(clr),
    .en(en),
    .in(nb_bits),
    .out(nbb)
);

wire [7:0] stt;
register state_reg(
    .CLK(CLK),
    .clr(clr),
    .en(en),
    .in(state),
    .out(stt)
);

nb_bits_register 模块是类比的;在解决这个问题之前我不想参数化。

`timescale 1ns / 1ps

module nb_bits_register(
    input CLK,
    input clr,
    input en,
    input [3:0] in,
    output [3:0] out
    );

    reg [3:0] temp;

    always @ (posedge CLK or posedge clr) begin
        if (clr) begin
            temp <= 4'b0000;
        end
        else if (en) begin
            temp <= in;
        end
        else begin
            temp <= temp;
        end
    end

    assign out = temp;

endmodule

这是一个模拟: enter image description here

和测试台:

`timescale 1ns / 1ps

module state_machine_tb();

    reg CLK, clr, en;
    reg [7:0] symbol;
    reg [3:0] nb_bits;
    wire [7:0] state;

    initial begin
        CLK <= 1;
        clr <= 0;
        en <= 0;
        symbol <= 8'b00110010;
        nb_bits <= 1;
        #10

        clr <= 1;
        en <= 1;
        #10

        clr <= 0;
        symbol <= 8'b00110001;
        nb_bits <= 1;
        #10

        symbol <= 8'b00110010;
        nb_bits <= 2;
        #10

        symbol <= 8'b00110001;
        nb_bits <= 1;
        #10

        symbol <= 8'b00110001;
        nb_bits <= 1;
        #10

        symbol <= 8'b00110000;
        nb_bits <= 3;
        #10

        $finish;
    end

    always begin
        #5 CLK <= ~CLK;
    end

    state_machine state_machine_inst(
        .CLK(CLK),
        .clr(clr),
        .en(en),
        .symbol(symbol),
        .nb_bits(nb_bits),
        .state(state)
    );

endmodule

【问题讨论】:

    标签: verilog


    【解决方案1】:

    这似乎是调度程序中的一个 rase 条件。根据 Verilog LRM 的定义,评估程序块(总是块和初始块)的顺序是不确定的。您可能会注意到具有特定模拟器和版本的模式,但是当更改模拟器或更改同一模拟器的版本时,该模式可能会发生变化。

    • 对时钟使用阻塞分配(例如:always #5 CLK = ~CLK;)。 With 将保证 CLK 将在其他刺激之前更新。
    • 在测试台中,将所有#10 更改为@(posedge CLK)。时间将是相同的,但它保证 CLK 在评估新值 symbol 和其他刺激之前已更新。

    仅供参考:如果您将output [7:0] out 更改为output reg [7:0] out,您可以直接在您的always 块中分配out,从而无需temp。这不会在功能上改变任何东西;只是更少的变量和代码行。

    【讨论】:

      【解决方案2】:

      这似乎是一个竞争条件:您对nb_bits 的更改与CLK 的正边缘一致,因此模拟器以这种方式解决了歧义:

      • 更改 nb_bits(从 1 到 2 等)
      • CLK 从 0 更改为 1
      • nb_bits_register中执行:if (en) temp &lt;= in; ... assign out = temp;

      结果,out = in 变成了nb_bits_register

      解决方案是避免这种巧合,例如通过将测试台中的第一个 #10 更改为 #11

      【讨论】:

        猜你喜欢
        • 2017-02-23
        • 1970-01-01
        • 1970-01-01
        • 2021-12-10
        • 2021-04-17
        • 1970-01-01
        • 1970-01-01
        • 2012-11-19
        • 1970-01-01
        相关资源
        最近更新 更多