我是否需要在连续的always 块中使用else 语句?

gra*_*er3 5 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
Run Code Online (Sandbox Code Playgroud)

但我想知道如果我使用不带 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
Run Code Online (Sandbox Code Playgroud)

Mat*_*lor 5

是的,您可以在没有 的情况下使用else(因为它的行为与带有 的版本相同else)。是的,你应该不使用else(因为否则你看起来像一个业余爱好者,没有人想要这样!)

OutReg是一个reg. Verilog 中的Areg就像任何软件语言中的变量一样;它的值将是最后分配给它的任何值。在您的电路中,您不希望更改OutRegif Deis not的值1'b1,因此在这种情况下您不需要分配任何新值OutReg。因此,您不需要else.