Verilog 初始化移位寄存器

Verilog 初始化移位寄存器,verilog,shift-register,Verilog,Shift Register,我为移位寄存器制作了一个模块,并试图用一个变量值来初始化它。但它不起作用 这是密码 module shiftreg(dataOut,EN, in, CLK, Q,init); parameter n = 4; input [n-1:0] init; //the initial value of the register input EN; input in; input CLK; output [n-1:0] Q; output dataOut; reg dataOu

我为移位寄存器制作了一个模块,并试图用一个变量值来初始化它。但它不起作用

这是密码

module shiftreg(dataOut,EN, in, CLK, Q,init);
   parameter n = 4; 
   input [n-1:0] init; //the initial value of the register
   input EN; input in; 
   input CLK; output [n-1:0] Q; output dataOut; reg dataOut;
   reg [n-1:0] Q;  //needs to be saved for future shifts.

   initial 
   begin
      Q=init; dataOut=init[0];
   end

   always @(posedge CLK) 
   begin 
      if (EN) 
      begin
         Q={in,Q[n-1:1]}; 
         dataOut=Q[0];
      end 
   end 
endmodule

init
必须是在
initial
块内部工作的内容,并且它只能用于RTL模拟和一些FPGA。大多数合成器忽略
初始
块。一个更好的方法是在加载中添加一点。将非阻塞赋值输出到寄存器是一个好主意。您可以使用assign语句使用
dataOut
保存触发器

always @(posedge CLK) begin
  if (LOAD)  Q <= init;
  else if (EN)    Q <= {in,Q[n-1:1]}; 
end
assign dataOut = Q[0];
始终@(posedge CLK)开始

如果(LOAD)Q没有编译错误…它支持初始块…im使用modelsim altera…如果我使用常量初始化reg,则其工作正常…您可以通过
in
值将其移入,这将需要额外的时钟。另一个选项是have
init
作为参数,以便在时间0之前知道值,然后使用初始块。s/content/constant/?