在Verilog中实现一个32x64寄存器文件

在Verilog中实现一个32x64寄存器文件,verilog,armv8,Verilog,Armv8,以下是注册表文件的规格: 总线A、B和W的宽度为64位 input [4:0] RA,RB,RW; 当RegWr设置为1时,总线W上的数据存储在 由Rw指定的寄存器,位于负(下降)时钟边缘 寄存器31必须始终读取零 来自寄存器(由Ra和Rb指定)的数据通过总线A和总线B发送 总线B分别延迟2秒后 写入寄存器文件的延迟必须为3秒 寄存器文件模块应具有以下接口: module RegisterFile(BusA, BusB, BusW, RA, RB, RW, RegWr, Clk); 这是

以下是注册表文件的规格:

  • 总线A、B和W的宽度为64位

    input [4:0] RA,RB,RW;
    
    当RegWr设置为1时,总线W上的数据存储在 由Rw指定的寄存器,位于负(下降)时钟边缘

    寄存器31必须始终读取零

    来自寄存器(由Ra和Rb指定)的数据通过总线A和总线B发送 总线B分别延迟2秒后

    写入寄存器文件的延迟必须为3秒

寄存器文件模块应具有以下接口:

module RegisterFile(BusA, BusB, BusW, RA, RB, RW, RegWr, Clk);
这是我目前的节目

module RegisterFile(BusA, BusB, BusW, RA, RB, RW, RegWr, Clk);
 output [63:0] BusA;
 output [63:0] BusB;
 output [63:0] BusW;
 input RA;
 input RB;
 input RW;
 input RegWr;
 input Clk;
 reg [31:0] registers [31:0];

 assign #2 BusA = registers [0];
 assign #2 BusB = registers [1];

 always @ (negedge Clk) begin
  if(RegWr & RW !=0)
    registers[RW] <= #3 BusW;
 end
endmodule
模块寄存器文件(BusA、BusB、BusW、RA、RB、RW、RegWr、Clk);
输出[63:0]BusA;
输出[63:0]母线;
输出[63:0]BusW;
输入RA;
输入RB;
输入RW;
输入RegWr;
输入时钟;
reg[31:0]寄存器[31:0];
分配#2 BusA=寄存器[0];
分配#2总线=寄存器[1];
始终@(negedge Clk)开始
如果(RegWr&RW!=0)

寄存器[RW]首先需要在代码中更改一些内容

  • BusA、BusB和BusW是每个64位宽的数据总线。BusW被用作输入总线,而BusA和BusB是输出总线。因此,港口的申报需要根据需要进行更改

    input [63:0] BusW;
    output [63:0] BusA, BusB;
    
  • 寄存器文件的深度为32。RA、RB和RW是地址总线。这些地址需要5位宽

    input [4:0] RA,RB,RW;
    
  • 然后可以将完整的代码重新编写为

    module RegisterFile(BusA, BusB, BusW, RA, RB, RW, RegWr, Clk);
      output [63:0] BusA, BusB;
      input [63:0] BusW;
      input [4:0] RA, RB, RW;
      input RegWr;
      input Clk;
    
      reg [63:0] registers [31:0];
    
      assign #2 BusA = registers[RA];
      assign #2 BusB = registers[RB];
    
      always @ (negedge Clk) 
      begin
        if(RegWr)
          if (RW != 4'd31)
            registers[RW] <= #3 BusW;
          else 
            // This is done to allow the user to reset the 0th location to a zero value.
            registers[0] <= #3 'd0; 
      end
    endmodule
    
    模块寄存器文件(BusA、BusB、BusW、RA、RB、RW、RegWr、Clk);
    输出[63:0]总线A、总线B;
    输入[63:0]BusW;
    输入[4:0]RA、RB、RW;
    输入RegWr;
    输入时钟;
    寄存器[63:0]寄存器[31:0];
    分配#2 BusA=寄存器[RA];
    分配#2总线=寄存器[RB];
    始终@(negedge Clk)
    开始
    if(RegWr)
    如果(RW!=4'd31)
    寄存器[RW]