verilog - 我是否需要在顺序的 always block 中使用 else 语句?

标签 verilog

现在我要实现时钟门控,如下所示。
但我不明白为什么以及如何处理 De 信号?

module ClockGating( 


           input wire rst_n,
           input wire clk,
           input wire De,  
           input wire InReg,

           output reg OutReg

   );

   always @( posedge clk or negedge rst_n )
     begin
     if ( !rst_n ) begin   
            OutReg <= 0;
     end
     else begin
        if ( De ) begin
               OutReg  <= InReg;
            end
        else
               OutReg  <= OutReg;
     end
   end

endmodule

但我想知道如果我不使用 else 语句会发生什么?
我可以在没有 else 语句的情况下使用吗?
module ClockGating( 


           input wire rst_n,
           input wire clk,
           input wire De,  
           input wire InReg,

           output reg OutReg

   );

   always @( posedge clk or negedge rst_n )
     begin
     if ( !rst_n ) begin   
            OutReg <= 0;
     end
     else begin
        if ( De ) begin
               OutReg  <= InReg;
            end
      end

endmodule

最佳答案

是的,您可以在没有 else 的情况下使用(因为它的行为与带有 else 的版本相同)。是的,您应该在没有 else 的情况下使用(否则你看起来像个业余爱好者,没人想要!)
OutRegreg .一个 reg在 Verilog 中就像任何软件语言中的变量一样;它的值将是最后分配给它的任何值。在您的电路中,您不希望更改 OutReg 的值。如果 De不是 1'b1 ,因此您无需为 OutReg 分配任何新值在这种情况下。因此,您不需要 else .

关于verilog - 我是否需要在顺序的 always block 中使用 else 语句?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42503059/

相关文章:

python - 带cocotb的verilog : assign statement

function - Verilog 函数返回时钟周期太晚

verilog - 什么是推断锁存器以及在 if 条件中缺少 else 语句时它是如何创建的。谁能简要解释一下?

vhdl - 是否可以设计一个基于锁存器的 FIFO 而不是 FF?

Verilog 模块实例化和空开始结束

verilog - 如何在 Verilog 中初始化推断 block RAM (BRAM) 的内容

arrays - 覆盖 systemverilog 中结构数组参数的大小

Verilog 注册分配?

verilog - 在 verilog 中显示实数,但 bitstoreal 仅返回 0.000000

verilog - 在 Icarus Verilog 中调试组合逻辑循环