【问题标题】:how to preset the register arrays in Verilog?如何在 Verilog 中预设寄存器数组?
【发布时间】:2020-10-19 16:50:35
【问题描述】:

我正在尝试在 Verilog 中定义一个 32 位宽 32 位深的寄存器文件。如何在有/没有 for 循环的情况下将所有值预设为零或我想要的任何值?

这是我的代码,我试过但失败了:

module register_file(rna, rnb, qa, qb);
  input [4:0]rna;
  input [4:0]rnb;
  output [31:0]qa;
  output [31:0]qb;
  genvar i;
  reg [31:0]registers[0:31];
  assign registers[0]=32'b0;
  registers[1]=32'b0;
  registers[2]=32'b0;
  registers[3]=32'b0;
endmodule

【问题讨论】:

  • 如何方便地预设所有寄存器值。修复语法错误或编写完全不同的代码都可以。
  • 对不起,我是新来的。
  • 如果所有registers'位都将在同一个always中驱动,则在第一个if子句中放置一个for循环,registers'地址为循环变量。这样,它适用于其中每个字具有相同预设/重置值的寄存器文件。如果您要为每个单词预设不同的值,最好使用自定义方法。
  • 是的,我了解到 for 循环应该放在一个块中,就像总是和初始一样。否则可能会发生错误。

标签: arrays verilog


【解决方案1】:

预设寄存器值的常用方法是使用时钟和复位信号。例如:

reg [31:0]registers[0:31];
integer i;
always @(posedge clk) begin
    if (reset) begin
        for (i = 0; i < 31; i = i + 1)
            registers[i] <= 0;
    end
    else begin
        // do some real work with registers here
    end
 end

在某些情况下,您可能希望在测试台初始块中进行一些初始设置

    initial begin
      for (i = 0; ...) registers[i]= 0;
    end

以上内容通常无法合成。

System Verilog 中提供的其他方法很少。

【讨论】:

  • 我可以在测试台上进行初始化。感谢您的指导。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-09
  • 1970-01-01
相关资源
最近更新 更多