为 Verilog 中的 reg 变量分配可综合的初始值

26

我是一名FPGA初学者,正在尝试学习Verilog。在always块中,我如何“赋值”给一个reg,无论是作为初始值还是常量。我尝试在下面的代码中执行类似以下的操作。因为8位常量不被视为输入,所以出现了错误。我也不想通过时钟来触发always块。我只想将寄存器分配给特定的值。由于我想要它可综合,所以不能使用initial块。非常感谢。

module top
(
    input wire clk,
    output wire [7:0] led   
 );


reg [7:0] data_reg ; 
always @*
begin
    data_reg = 8'b10101011;
end

assign led = data_reg;

endmodule
5个回答

36

你可以将寄存器声明与初始化结合在一起。

reg [7:0] data_reg = 8'b10101011;

或者你可以使用一个 initial

reg [7:0] data_reg;
initial data_reg = 8'b10101011;

@Tim 也可以在 Quartus 中为 Altera 的 Cyclone II 进行综合。 - Roman Starkov
@NathanFarrington,是否可以使用变量(例如模块的输入参数)初始化寄存器?我尝试直接上述方法进行操作,但无法正常工作。 - ishan3243
@anonymous 可以使用参数初始化寄存器,但无法使用常规输入。 - alex.forencich
这个能合成吗? - augurar
这取决于您的综合工具供应商、版本和设置。传统的综合工具忽略初始条件,但现在有些工具支持它们。 - plugwash
我有点困惑。我知道的方法是使用复位线。你能提供一个来源吗? - JobHunter69

6

您应该使用FPGA文档推荐的方式。除了使用复位网络之外,没有其他便携式的初始化寄存器值的方法。这在大多数综合目标上都有与之相关的硬件成本。


5

始终@*永远不会触发,因为没有右侧参数发生变化。为什么不使用具有assign的导线?

module top (
    input wire clk,
    output wire [7:0] led   
);

wire [7:0] data_reg ; 
assign data_reg   = 8'b10101011;
assign led        = data_reg;

endmodule

如果你真的想要一个可以更改值的 flop,那么默认值将在重置子句中。

module top
(
    input        clk,
    input        rst_n,
    input  [7:0] data,
    output [7:0] led   
 );

reg [7:0] data_reg ; 
always @(posedge clk or negedge rst_n) begin
  if (!rst_n)
    data_reg <= 8'b10101011;
  else
    data_reg <= data ; 
end

assign led = data_reg;

endmodule

希望这可以帮助到您。

5

1
那不是KC的论文所说的。他只是说重置线可能很昂贵,你应该考虑每个设计部分是否真的需要重置,因为它可能会迅速从未知状态下时钟输出,或者可能无法使用重置(例如SRL16)。绝对错误的结论是应该避免显式的重置线。 - EML
我更新了我的回答,使用了单词“全局”。KC明确表示,全局复位线是不好的(昂贵、耗时且不必要),应仅在必要时使用重置电路。 - Mark Lakata

4
当芯片获得电源时,它的所有寄存器都包含随机值。无法拥有初始值。它将始终是随机的。 这就是为什么我们有复位信号来将寄存器重置为已知值的原因。复位由芯片外部控制,我们编写代码来使用它。
always @(posedge clk) begin
    if (reset == 1) begin // For an active high reset
        data_reg = 8'b10101011;
    end else begin
        data_reg = next_data_reg;
    end
end

8
你所说的对ASICs通常是正确的,但不适用于FPGAs。当你下载位文件时,所有存储单元都会被初始化。在基于FPGA的设计中,通常不需要或对重置没有帮助,并可能导致更大的面积和更低的Fmax。最好的重置方法是重新下载位文件。 - Nathan Farrington
@NathanFarrington 谢谢。我有类似的问题要解决。对于一个FSM,我有一个状态寄存器,似乎在我将其分配为驱动输出线之前不会初始化。我打开了另一个帖子链接。这个行为似乎与我们正在讨论的有关。也许你可以去看看告诉我你的想法。这是针对Xilinx FPGA编写的Verilog代码。谢谢。 - Frank Dejay

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接