如何在verilog中拆分顺序和组合

fla*_*ama 0 counter verilog clock

我正在尝试在 verilog 中创建一个计数器,我想知道如何将连续部分与组合部分分开。

我有这个模块,它工作正常,但我不知道如何拆分它?

module counter4bits(
    input clk_i,
    input rst_n_i,
    input enable_i,
    input   up_down_i,
    output reg[3:0] val_o);

    always@(posedge clk_i) begin
        if (rst_n_i == 1)
            val_o <= 0;
        else if(enable_i == 1)
            val_o <= val_o + 1;
        end

endmodule
Run Code Online (Sandbox Code Playgroud)

Mor*_*mer 5

一种方法是always @(*)使用阻塞赋值 ( =)为组合部分创建always @(posedge clk_i)块,并使用<=简单 reg的非阻塞赋值 ( ) 为连续部分创建块。

阻塞分配(=)的组合提供了更快的仿真和可预测的行为,即使明确灵敏度名单线@(rst_n_i or enable_i or ...)来代替@(*)<=顺序逻辑中的非阻塞赋值 ( ) 给出了预期的触发器行为,其中下一个值取决于前一个值。

代码将如下所示:

module counter4bits(
    ... input/output with no change
    reg [3:0] val_nxt;  // Not flip-flop but used in always @(*) thus reg

    always @(*) begin
        if (rst_n_i == 1)
            val_nxt = 0;
        else if(enable_i == 1)
            val_nxt = val_o + 1;
        end

    always @(posedge clk_i)
        val_o <= val_nxt;

endmodule
Run Code Online (Sandbox Code Playgroud)