如何将初始值分配给输入reg:设计编​​译器删除分配

时间:2019-02-23 09:00:50

标签: verilog asic

我是ASIC设计的新手。我有一个设计,例如两个输入a,b。我正在使用以下代码初始化这两个信号。但是Design编译器会生成警告,指出寄存器“ a”是一个常量,将被删除。当我尝试进行合成后仿真时,这两个信号都是“ z”。那么如何应用初始信号分配来避免此类问题?

always @(posedge(clk) or posedge (rst)) begin
 if (rst) begin
     a<=4d'5;
     b  <=4'd10;
  end
end

1 个答案:

答案 0 :(得分:2)

在描述硬件系统时,您需要考虑到模块的输入信号来自另一个模块/系统,并且它们的值由该信号确定。任何模块的输入只能是wire类型。

您可以将模块视为具有输入和输出的框。输出信号的值由盒内的输入信号+逻辑决定。但是,模块无法决定其输入应为什么。仅当有反馈时才有可能,即使在这种情况下,它也将取决于模块控制范围之外的其他信号。

因此,可以将输出信号声明为output reg,但对于输入则不是这样。但是,对于您的问题,有解决方案,我认为可以使用以下方法来设计您想要的东西:

module your_module(
input clk,
input rst,
//other inputs and outputs that you might need
input [3:0] a,
input [3:0] b
);
//define registers 
reg [3:0] a_register;
reg [3:0] b_register;
/* 
These registers are defined to make it possible to
to give any value to that logics when posedge rst 
is detected, otherwise you can use them as your
input logics
*/ 
//use initial block if you need
always@(posedge clk or posedge rst) begin
  if(rst) begin
    a_register <= 4'd5;
    b_register <= 4'd10;
  end
  else
    begin
      a_register <= a;
      b_register <= b;
      // and use a_register and b_register as you want to use a and b
    end
end
endmodule