vivado 不会合成 bram,而是创建 LUT

问题描述 投票:0回答:1
module bram3 (clka,clkb,ena,enb,wea,web,addra,dia,dib,doa,dob,rst);
       
       input clka,clkb,ena,enb,wea,web,rst;
       input [11:0] addra;
       input [63:0] dia,dib;
       output [63:0] dob, doa;
       reg [32:0] ram [254:0];
       reg [32:0] dob, doa;
       
       reg [11:0] new_addr=0;
       reg [11:0] number_of_lines=0;
       
       always @(posedge clka)
       begin
           if (ena)
           begin
               if (wea) ram[addra] <= dia;
               doa <= ram[addra];
           end
       end
       
       
        
       
       always @(posedge clkb or negedge rst)
       begin
       
       if (!rst)
       begin
       new_addr<=0;
       end
         else  if (enb)
             begin
           if (new_addr==0)
             number_of_lines <= ram[0];
             
             new_addr<=new_addr+1;
             dob <= ram[new_addr];
             if (new_addr==number_of_lines)
             new_addr<=0;
       end   
       end
   endmodule

添加行

number_of_lines <= ram[0]
后,vivado将不会合成BRAM组件。相反,我得到了一个 LUT 方案。我知道我不能阅读超过 2 次。 (在我的代码中,我有 3 次读取),但我需要逻辑才能在我的代码中实现。我怎样才能重写逻辑来制作像照片中那样的可合成胸罩?

添加行

number_of_lines <= ram[0]
后,vivado将不会合成BRAM组件。相反,我得到了一个 LUT 方案。我知道我不能阅读超过 2 次。 (在我的代码中,我有 3 次读取),但我需要逻辑才能在我的代码中实现。我怎样才能重写逻辑来制作像照片中那样的可合成胸罩?

verilog xilinx vivado zynq
1个回答
0
投票

我为了对具有 N 个读取端口的 RAM 进行建模,对 RTL 进行编码,以便推断出 N 个 BRAM,并且所有 N 个 RAM 都获得相同的写入信号。使用 Vivado 将其识别为单个双端口 BRAM 的编码风格对读取侧 RAM 控制逻辑进行编码。根据需要使用 RTL 控制逻辑将 N 个读取路径合并为一个。

您可以有 N 个内存变量,但是有更好的方法来编码。将一个 BRAM 的逻辑放置在其自己的模块中,并在父模块中实例化该模块 N 次。不要将复位传递给内存模块,如果存在复位,Vivado 将不会推断 BRAM。这是一种更干净且不易出错的方法,为每个内存声明单独的变量。

这不是一种有效的方法(就 BRAM 利用率而言),因为相同的数据被冗余存储,但它在推断 BRAM 的同时提供了所需的 N 端口读取。

© www.soinside.com 2019 - 2024. All rights reserved.