在线咨询 切换到宽版
eetop公众号 创芯大讲堂 创芯人才网

 找回密码
 注册

手机号码,快捷登录

手机号码,快捷登录

搜帖子
查看: 702|回复: 13

[求助] 关于BRAM无法被综合的问题

[复制链接]
发表于 2025-4-9 13:06:34 | 显示全部楼层 |阅读模式
悬赏100资产未解决
BRAM综合时间太长甚至无法被综合。
BRAM的深度是4096,每个地址存储一个字节。数据位宽是128位,地址位宽是12位。连接的是axi full slave 接口,所以涉及到AWSIZE地址自增步长和WSTRB的数据总线字节选通。
我自己写的BRAM的第一种写法:同一个always块内进行不同的地址偏移写入数据。


                               
登录/注册后可看大图

发现第一种写法综合时间太长,看log是说无法被综合成BRAM或者DRAM,于是我换成第二种写法,把BRAM的不同地址分别写到不同的always块内,但还是不行。

                               
登录/注册后可看大图


                               
登录/注册后可看大图

本人是第一次写BRAM,不知道BRAM是否有相应的代码规范。有没有知道解决办法的佬,请帮忙解答一下,非常感谢!

发表于 2025-4-9 13:49:30 | 显示全部楼层
大的ram块,一般都是实例化现成的sram,而不是用reg来搭,让dc来综合
 楼主| 发表于 2025-4-9 15:08:14 | 显示全部楼层


   
goaheadxxt 发表于 2025-4-9 13:49
大的ram块,一般都是实例化现成的sram,而不是用reg来搭,让dc来综合


感谢回复。可是例化现成的sram也是需要综合的吧,那么和自己写的在综合上不一样吗。是不是设计规范的问题,比如说现成的sram是符合sram的设计规范,所以更容易综合?这只是我猜想,如果不对,请指教,感谢!
发表于 2025-4-9 15:42:10 | 显示全部楼层


   
iccc_learner 发表于 2025-4-9 15:08
感谢回复。可是例化现成的sram也是需要综合的吧,那么和自己写的在综合上不一样吗。是不是设计规范的问题 ...


不是的,现成的sram是作为blackbox处理的,只要读入db就行了。
 楼主| 发表于 2025-4-9 18:24:04 | 显示全部楼层


   
goaheadxxt 发表于 2025-4-9 15:42
不是的,现成的sram是作为blackbox处理的,只要读入db就行了。


好的。如果我自己非要写sram的话是不是要写成小块的才行呢,比如把大块的sram分成多个小块的sram可以吗
发表于 2025-4-10 15:08:05 | 显示全部楼层
我觉得应该不需要,我之前也综合过,慢是确实慢,但是也是能综合出来的。
要不你把dc报的问题发出来看看?
 楼主| 发表于 2025-4-10 21:54:20 | 显示全部楼层


   
goaheadxxt 发表于 2025-4-10 15:08
我觉得应该不需要,我之前也综合过,慢是确实慢,但是也是能综合出来的。
要不你把dc报的问题发出来看看? ...


感谢回复。我目前只在vivado综合过,不是在dc综合的,所以可能会有差异。我这个后面是需要先上fpga 的板子,所以先在vivado综合。在vivado综合的时候,我需要把代码综合成BRAM,因为数据总线128位,我需要把数据在一个周期内写入多个地址,我的第一种写法在一个always块内完成所有地址的写入,但是当时综合了几个小时还没综合完成,并且日志里提到的是这样的 微信图片_20250410214456.png ,也就是无法综合成BRAM,甚至不能综合成DRAM,只能综合成寄存器,我就终止综合了。后面我查了一下,以为是代码风格问题,然后我尝试了第二种写法,把不同地址的写入分到不同的always块。这次也是综合几个小时,最终vivado报错是综合失败,奇怪的是没有message,log里面也看不出问题,只是综合失败。
 楼主| 发表于 2025-4-10 21:59:28 | 显示全部楼层


   
iccc_learner 发表于 2025-4-10 21:54
感谢回复。我目前只在vivado综合过,不是在dc综合的,所以可能会有差异。我这个后面是需要先上fpga 的板 ...


这是具体的代码。

RAM.zip

1.91 KB, 下载次数: 4 , 下载积分: 资产 -1 信元, 下载支出 1 信元

发表于 2025-4-11 12:03:58 | 显示全部楼层
写太花FPGA综合工具会认不出来。要写得尽量简单,把与RAM无关的逻辑挪到外面才可以。
或者按厂家给的Template写也是可以的。




   

        

                
  1. module bram #(
  2.     parameter AWADDR = 12,
  3.     parameter DWI = 128,
  4.     parameter ARADDR = 12,
  5.     parameter DRO = 128
  6. )
  7. (
  8.         input clk,
  9.     input [AWADDR-1 : 0] awaddr,
  10.     input [15 : 0] w_en,   
  11.     input [DWI-1 : 0] wdata,
  12.     input [ARADDR-1 : 0] araddr,
  13.     input r_en,
  14.     output reg [DRO-1 : 0] rdata
  15. );
  16. (* ram_style = "block" *) reg [7:0] mem0  [(1<<AWADDR)-1 : 0];
  17. (* ram_style = "block" *) reg [7:0] mem1  [(1<<AWADDR)-1 : 0];
  18. (* ram_style = "block" *) reg [7:0] mem2  [(1<<AWADDR)-1 : 0];
  19. (* ram_style = "block" *) reg [7:0] mem3  [(1<<AWADDR)-1 : 0];
  20. (* ram_style = "block" *) reg [7:0] mem4  [(1<<AWADDR)-1 : 0];
  21. (* ram_style = "block" *) reg [7:0] mem5  [(1<<AWADDR)-1 : 0];
  22. (* ram_style = "block" *) reg [7:0] mem6  [(1<<AWADDR)-1 : 0];
  23. (* ram_style = "block" *) reg [7:0] mem7  [(1<<AWADDR)-1 : 0];
  24. (* ram_style = "block" *) reg [7:0] mem8  [(1<<AWADDR)-1 : 0];
  25. (* ram_style = "block" *) reg [7:0] mem9  [(1<<AWADDR)-1 : 0];
  26. (* ram_style = "block" *) reg [7:0] mem10 [(1<<AWADDR)-1 : 0];
  27. (* ram_style = "block" *) reg [7:0] mem11 [(1<<AWADDR)-1 : 0];
  28. (* ram_style = "block" *) reg [7:0] mem12 [(1<<AWADDR)-1 : 0];
  29. (* ram_style = "block" *) reg [7:0] mem13 [(1<<AWADDR)-1 : 0];
  30. (* ram_style = "block" *) reg [7:0] mem14 [(1<<AWADDR)-1 : 0];
  31. (* ram_style = "block" *) reg [7:0] mem15 [(1<<AWADDR)-1 : 0];

  32. always @(posedge clk) begin
  33.     if(w_en[0])  mem0[awaddr]  <= wdata[8*0 +:8];
  34.     if(w_en[1])  mem1[awaddr]  <= wdata[8*1 +:8];
  35.     if(w_en[2])  mem2[awaddr]  <= wdata[8*2 +:8];
  36.     if(w_en[3])  mem3[awaddr]  <= wdata[8*3 +:8];
  37.     if(w_en[4])  mem4[awaddr]  <= wdata[8*4 +:8];
  38.     if(w_en[5])  mem5[awaddr]  <= wdata[8*5 +:8];
  39.     if(w_en[6])  mem6[awaddr]  <= wdata[8*6 +:8];
  40.     if(w_en[7])  mem7[awaddr]  <= wdata[8*7 +:8];
  41.     if(w_en[8])  mem8[awaddr]  <= wdata[8*8 +:8];
  42.     if(w_en[9])  mem9[awaddr]  <= wdata[8*9 +:8];
  43.     if(w_en[10]) mem10[awaddr] <= wdata[8*10 +:8];
  44.     if(w_en[11]) mem11[awaddr] <= wdata[8*11 +:8];
  45.     if(w_en[12]) mem12[awaddr] <= wdata[8*12 +:8];
  46.     if(w_en[13]) mem13[awaddr] <= wdata[8*13 +:8];
  47.     if(w_en[14]) mem14[awaddr] <= wdata[8*14 +:8];
  48.     if(w_en[15]) mem15[awaddr] <= wdata[8*15 +:8];
  49. end

  50. always @(posedge clk) begin
  51.     if(r_en) begin
  52.         rdata[8*0 +: 8]  <= mem0[araddr];
  53.         rdata[8*1 +: 8]  <= mem1[araddr];
  54.         rdata[8*2 +: 8]  <= mem2[araddr];
  55.         rdata[8*3 +: 8]  <= mem3[araddr];
  56.         rdata[8*4 +: 8]  <= mem4[araddr];
  57.         rdata[8*5 +: 8]  <= mem5[araddr];
  58.         rdata[8*6 +: 8]  <= mem6[araddr];
  59.         rdata[8*7 +: 8]  <= mem7[araddr];
  60.         rdata[8*8 +: 8]  <= mem8[araddr];
  61.         rdata[8*9 +: 8]  <= mem9[araddr];
  62.         rdata[8*10 +: 8] <= mem10[araddr];
  63.         rdata[8*11 +: 8] <= mem11[araddr];
  64.         rdata[8*12 +: 8] <= mem12[araddr];
  65.         rdata[8*13 +: 8] <= mem13[araddr];
  66.         rdata[8*14 +: 8] <= mem14[araddr];
  67.         rdata[8*15 +: 8] <= mem15[araddr];
  68.     end
  69. end

  70. endmodule
            

   

    复制代码


 楼主| 发表于 2025-4-11 23:39:03 | 显示全部楼层


   
Challensys 发表于 2025-4-11 12:03
写太花FPGA综合工具会认不出来。要写得尽量简单,把与RAM无关的逻辑挪到外面才可以。
或者按厂家给的Templa ...


这样吗,好的,谢谢。我尝试写得简单一点,不过似乎是需要保证每个BRAM每个时钟周期只被写入或者读取一次是吗
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版| 小黑屋| 关于我们| 联系我们| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2025-5-28 12:30 , Processed in 0.183992 second(s), 6 queries , Gzip On, Redis On.

eetop公众号 创芯大讲堂 创芯人才网
快速回复 返回顶部 返回列表