优化systemverilog中的registerfile代码

时间:2017-01-05 19:09:27

标签: verilog system-verilog

我正在实现32位RegFile(包含32个寄存器)。现在,对于组合部分,我计划根据输入寄存器编号使用开关盒来输出32位寄存器的读取值。这导致了一个具有32个案例和默认情况的开关盒。有没有其他方法来优化代码?约束是我的输出需要是一个寄存器,因此我无法使用以下语句(包含assign):

        pygame.draw.rect(screen,black,(self.x,self.y,self.w,self.h),4)
        TypeError: Rect argument is invalid

代码:

assign rdDataA = rdAddrA == 0 ? reg0 

更新: 我发现了一种优化代码的方法。我希望这会奏效......欢迎任何其他建议

module RegFile(input [4:0] src_rd_1,
       input [4:0] src_rd_2,
       input [4:0] des_wr_1,
       input [31:0] data,
       input clk,
       input reset,
       input wr_en,
       output reg rd_val_1,
       output reg rd_val_2
            );

reg [31:0] register[31:0];

always_comb begin
case(src_rd_1)
5'd0:begin
rd_val_1=register[0];
end
5'd1:begin
rd_val_1=register[1];
end
5'd2:begin
rd_val_1=register[2];
end
5'd3:begin
rd_val_1=register[3];
end
5'd4:begin
rd_val_1=register[4];
//and so on...
end

任何建议都会有所帮助。 TIA

2 个答案:

答案 0 :(得分:0)

模拟工具允许以下内容:

always_comb begin
  rd_val_1 = register[src_rd_1];
end

您必须尝试一下,看看您的综合工具是否支持此功能。

答案 1 :(得分:0)

使用reg并不意味着它将合成到寄存器。要合成寄存器,应在顺序始终块中分配reg(或用于SystemVerilog preferably逻辑`)。

always_ff @(posedge clk) begin
  rd_val_1 <= register[src_rd_1];
end

翻转输出使其成为干净,无干扰的输出,并且不会增加任何接收模块的组合传播延迟。