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

如何在verilog中拆分顺序和组合,verilog,counter,clock,Verilog,Counter,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

我正在尝试用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
模块计数器4位(
输入clk_i,
输入rst\u n\u i,
输入使能_i,
输入up\u down\u i,
输出寄存器[3:0]val_o);
始终@(posedge clk_i)开始
如果(rst_n_i==1)

val_o一种方法是使用分块分配(
=
)为组合部件生成
始终(*)块,并使用非分块分配为顺序部件生成
始终(*)块(
一种方法是生成
始终(*)
为使用分块分配的组合部件设置块(
=
),并为使用非分块分配的顺序部件设置块(
为什么要拆分组合逻辑和顺序逻辑)。
您编写的代码是电源优化的好风格。

根据您的代码风格,工具可以理解触发器值将在enable_i上改变,因此工具足够智能,可以使用enable_i为触发器设置一个时钟门,从而降低功耗。

为什么要拆分组合逻辑和顺序逻辑。 您编写的代码是电源优化的好风格。 根据您的代码风格,工具可以理解触发器值将在enable_i上改变,因此工具足够智能,可以使用enable_i为触发器设置时钟门,从而降低功耗

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