取消
显示结果 
显示  仅  | 搜索替代 
您的意思是: 
swjtumaxiaobao
Visitor
Visitor
441 次查看
注册日期: ‎06-04-2019

mem won't be mapped to RAM because it is too sparse

跳至解决方案

你好,我的设计中想生成一个三个端口的RAM,用BRAM实现。PortA可以读写,PortB只可以写,PortC只可以读。我按照RAM coding guidlines中的介绍进行设计,并且添加了综合指导(*ram_style = "block" *),但是综合出来是以LUT的形式出现,report中出现mem won't be mapped to RAM because it is too sparse

 

下面是我的代码,我想问下是否可以让mem综合成调用BRAM资源

module two_port_ram(
input hclk,
input ena,
input enb,
input enc,
input wena,//read/write
//input wenb,//just for write
input [ADDRWIDTH-1:0]addra,
input [ADDRWIDTH-1:0]addrb,
input [ADDRWIDTH-1:0]addrc,
input [31:0]dina,
input [31:0]dinb,
output reg [31:0] doa,
//output reg [31:0] dob,//for write
output reg [31:0] doc,// for read
output softmax_start
);


parameter ADDRWIDTH = 6;
parameter MEMDEPTH = 2**(ADDRWIDTH); 


(*ram_style = "block" *)reg [31:0] mem[MEMDEPTH-1:0];

assign softmax_start = (mem[0] == 32'hffff000);

//portA for ahb read/write
always@(posedge hclk)begin
if(ena)begin
if(wena)
mem[addra] <= dina;
doa <= mem[addra];
end
end


//portB for softmax write only
always@(posedge hclk)begin
if(enb)begin
mem[addrb] <= dinb;
end
end

//portC for softmax read only
always@(posedge hclk)begin
if(enc)
doc <= mem[addrc];
end

endmodule

0 项奖励
1 解答

已接受的解答
viviany
Xilinx Employee
Xilinx Employee
305 次查看
注册日期: ‎05-15-2008

你使用的是true dual port BRAM的模板,但是你对FPGA的dual port BRAM的功能做了个性化要求,即PortA可以读写,PortB只可以写,PortC只可以读。

这些个性化要求无法用infer的方式实现的。

你应该用标准的true dual port BRAM模板来描述一个标准的双端口BRAM,再用额外的代码来控制读写需求。

要注意UG901里面RAM的coding example,要基本上符合原模版才能infer出对应的RAM和资源。

-vivian

-------------------------------------------------------------------------------------------------
Don’t forget to reply, kudo, and accept as solution.
-------------------------------------------------------------------------------------------------
如果提供的信息能解决您的问题,请标记为“接受为解决方案”。
如果您认为帖子有帮助,请点击“奖励”。谢谢!
-------------------------------------------------------------------------------------------------

在原帖中查看解决方案

7 回复数
lcl_woniu
Visitor
Visitor
391 次查看
注册日期: ‎03-24-2020

他的意思应该是说 你这个资源用的太少 推荐你用lut实现  其实我觉得你完全没必要 还不如直接例化一个BRAM 然后外围加逻辑 只需要用en*信号确定哪个指令有效就好了

swjtumaxiaobao
Visitor
Visitor
385 次查看
注册日期: ‎06-04-2019

感谢!可是我把ADDRWIDTH 设置成12、14还是用LUT实现的,而且会消耗巨大的LUT资源,我感觉可能不是这个问题

0 项奖励
lcl_woniu
Visitor
Visitor
372 次查看
注册日期: ‎03-24-2020

而且 你写的那个逻辑应该有问题 同一个reg在不同的模块赋值 应该有bug 

swjtumaxiaobao
Visitor
Visitor
363 次查看
注册日期: ‎06-04-2019

是这样的,这个RAM有两个写端口,所以在不同的模块里赋值,我看vivado UG901手册中也是这么写的

0 项奖励
viviany
Xilinx Employee
Xilinx Employee
306 次查看
注册日期: ‎05-15-2008

你使用的是true dual port BRAM的模板,但是你对FPGA的dual port BRAM的功能做了个性化要求,即PortA可以读写,PortB只可以写,PortC只可以读。

这些个性化要求无法用infer的方式实现的。

你应该用标准的true dual port BRAM模板来描述一个标准的双端口BRAM,再用额外的代码来控制读写需求。

要注意UG901里面RAM的coding example,要基本上符合原模版才能infer出对应的RAM和资源。

-vivian

-------------------------------------------------------------------------------------------------
Don’t forget to reply, kudo, and accept as solution.
-------------------------------------------------------------------------------------------------
如果提供的信息能解决您的问题,请标记为“接受为解决方案”。
如果您认为帖子有帮助,请点击“奖励”。谢谢!
-------------------------------------------------------------------------------------------------

在原帖中查看解决方案

swjtumaxiaobao
Visitor
Visitor
291 次查看
注册日期: ‎06-04-2019

我看ROM可以有多个读端口可以infer,以为RAM也可以。谢谢!

0 项奖励