verilog里面,三维array可以被综合吗?
我想写这样的代码(只是示意),
reg [BUFF_ADR_WIDTH-1:0] buff_adr [PORTS-1:0] [STREAMS-1:0];
always @(posedge clk or negedge resetn) begin
if (~resetn)
for (xx=0; xx < PORTS; xx=xx+1)
for (yy=0; yy < STREAMS; yy=yy+1)
buff_adr[xx][yy] <= 'b0;
else
if (/*某种情况*/)
buff_adr[xx][yy] <= buff_adr[xx][yy]+A;
else if (/*某种情况*/)
buff_adr[xx][yy] <= B;
end
这样的代码可综合吗?前端tool都认吗(包括lint, DC,GCA,Formal等)?
在难调与代码简洁上,我选择后者。
再说也不是那么难调,把需要的信号选出来,// synthesis translate_off 就好了。
如果不用3D array,像[7:0] addr [3:0][3:0]这种变量你怎么定义,后面怎么操作?
呵呵,3D array会难读?相反的,我觉得会让代码很易读呀。
别阴阳怪气的说话。
http://www.sutherland-hdl.com/papers/2013-SNUG-SV_Synthesizable-SystemVerilog_paper.pdf
这是最新snug的文章,说了3d array的用法,应该是可以用的,再跟AE们确认下。
这种代码能过rtl review?要是我的话,我只会说两个字
重写
。。。。从来没见过人用,要是搞fpga可以试试,asic就算了吧,伤不起。。。
那篇文章写的是某种工具吧...
不过不知道会不会演变成一种给FPGA的语言,语法更高层,类似于C或者面向对象的语
言,综合器做了更多的事,也许面积效率低但门槛更低,就像现在matlab 的FPGA工具
箱;
另一方面ASIC还是以HDL为主,以硬件实现为思路,以效率为优先级。
当然是可综合的了
工具支持是没问题的
这些都是verilog和sv的标准可综合语法
问题是在verdi dump波形的时候
这种数组都是看不到值的
而用dumpmem的话会非常慢
这种简单的东西,工具就是应该支持才是。。
时代在进步,10年前怎么设计,现在还只能这么设计,不是什么好现象。
说到底是这玩意没有显著需求
现在数字的瓶颈并不在语言上
他说了RTL里面拖线出来我就不说verdi了
调FPGA找线也是麻烦的事情
你这想用for给相同的逻辑赋值,减少代码量,降低人为出错,想法是好的,但是思路不对。
你可以在verilog代码里面内嵌一些perl脚本。写完以后,脚本工具一跑,生成纯verilog代码。比如上面那一堆for循环,还有case语句的时候也可以这么用
也未必,理论上C/C++你可以定义N维数组
实际上超过二维的大都是1维来模拟
简单的就是好
.198
从软件考虑,确实很简单。但是你设计出来的电路要物理实现的,可不仅仅是综合出网表就可以了。过多的mux会导致很低的utility。另外大的数组都会优先考虑RAM,像楼主的情况,通常情况下都会考虑用RAM,面积差得可不是一点点。
向视频处理里面,二维数组很常见,三维都有,N维转一维是基本技术要求。
现在的工具别说sv就是c都可以转成rtl,但是基本上没有工程方面的意义。个人认为数字设计的一个核心问题就是对RAM的使用优化。
我上篇文章的意思是让大家不要固步自封
新工具新语言确实会大大提升我们的工作效率
但脚本确实也是很重要的方法
事实上sv的语法还不够强大
这样就要靠脚本来支持了
比如sv的宏定义还不能够像C语言一样支持变量的拼接
这个在大量相似逻辑但名字各不相同的时候是很有用的
同意,看有些人的回复,说得好像用个for循环,用个数组就是在写软件了。
实际上,语法的更新都是有道理的,只要能掌握那个度,明白trade off就好了。
老兄
你对数组的概念还停留在dff数组
事实上wire 数组才是更常用的情况
wire数组可以展开代码
实现最底层的门级电路
比如下面这种很常见的逻辑
input [N-1:0] a;
input [M-1:0] s;
input [N-1:0] b;
根据onehot的s对a移位,形成b
用数组写出门级实现就很简洁高效