Verilog 如何将初始值分配给输入reg:Design编译器删除分配

Verilog 如何将初始值分配给输入reg:Design编译器删除分配,verilog,asic,Verilog,Asic,我是ASIC设计的新手。我有一个设计,例如两个输入a,b。我使用下面的代码初始化这两个信号。但是设计编译器生成一个警告,表明寄存器“a”是一个常量,将被删除。当我试图进行合成后模拟时,这两个信号都是“z”。那么,我如何应用初始信号分配来避免这样的问题呢 always @(posedge(clk) or posedge (rst)) begin if (rst) begin a<=4d'5; b <=4'd10; end end 始终@(posedge(c

我是ASIC设计的新手。我有一个设计,例如两个输入a,b。我使用下面的代码初始化这两个信号。但是设计编译器生成一个警告,表明寄存器“a”是一个常量,将被删除。当我试图进行合成后模拟时,这两个信号都是“z”。那么,我如何应用初始信号分配来避免这样的问题呢

always @(posedge(clk) or posedge (rst)) begin
 if (rst) begin
     a<=4d'5;
     b  <=4'd10;
  end
end
始终@(posedge(clk)或posedge(rst))开始
如果(rst)开始

在描述硬件系统时,你需要考虑到模块的输入信号来自另一个模块/系统,它们的值是由这些信号决定的。任何模块的输入只能是
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
模块您的_模块(
输入时钟,
输入rst,
//您可能需要的其他输入和输出
输入[3:0]a,
输入[3:0]b
);
//定义寄存器
reg[3:0]a_寄存器;
reg[3:0]b_寄存器;
/* 
这些寄存器的定义使
在posedge rst时为该逻辑赋予任何值
已检测到,否则您可以将其用作
输入逻辑
*/ 
//如果需要,请使用初始块
始终@(posedge clk或posedge rst)开始
如果(rst)开始

在描述硬件系统时,你需要考虑到模块的输入信号来自另一个模块/系统,它们的值是由这些信号决定的。任何模块的输入只能是
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
模块您的_模块(
输入时钟,
输入rst,
//您可能需要的其他输入和输出
输入[3:0]a,
输入[3:0]b
);
//定义寄存器
reg[3:0]a_寄存器;
reg[3:0]b_寄存器;
/* 
这些寄存器的定义使
在posedge rst时为该逻辑赋予任何值
已检测到,否则您可以将其用作
输入逻辑
*/ 
//如果需要,请使用初始块
始终@(posedge clk或posedge rst)开始
如果(rst)开始

a_寄存器在给b赋值后,您没有输入分号。这是一个示例,主要目标是信号分配的方式您在给b赋值后没有输入分号。这是一个示例,主要目标是信号分配的方式谢谢您的回答。但我不想将a和b定义为输入端口。因为它们最初是二维的40*64数组。我只想[通过定义寄存器在设计中本地]给它们一个初始值。我的意思是,我没有选择“其他开始”。当我用design compiler编译它时,会弹出警告“寄存器是一个常量,将被删除”。然后你可以单独初始化每一行,或者你可以使用'readmemb'或'readmemh'不确定你使用的是哪种合成器,但如果你从逻辑上考虑这应该是可能的。大多数FPGA合成工具都可以做到这一点。谢谢你的回复。但我不想将a和b定义为输入端口。因为它们最初是二维的40*64数组。我只想[通过定义寄存器在设计中本地]给它们一个初始值。我的意思是,我没有选择“其他开始”。当我用design compiler编译它时,会弹出警告“寄存器是一个常量,将被删除”。然后你可以单独初始化每一行,或者你可以使用'readmemb'或'readmemh'不确定你使用的是哪种合成器,但如果你从逻辑上考虑这应该是可能的。大多数FPGA合成工具都可以做到这一点。检查