关于Verilog语言的用法与思考

大学EDA课程教授了Verilog语言,但部分语句只是停留在了课本上,并未实际应用。现在来填一下这方面的坑,记录自己的debug日常~

关于for循环的问题

课上老师曾经强调要少用for循环,理由是硬件语言不同于软件,for循环综合的电路本质上是将循环展开后串联,容易形成很长的时序路径。但这并不意味着for循环不能在实际设计中使用。当设计需要对某个变量进行逐位赋值,或者需要例化大量相同的模块,for循环就可以发挥作用。例如:

for (k=0; k<`WIDTH; k=k+1)
begin
	in_bit[k] = load_bits[ldcnt+k];
end

这里WIDTH是预先定义好的常量,load_bits是一定宽度的寄存器,通过for循环可将load_bits寄存器中的某些位赋值给in_bit的某位。需要注意的是,如果触发for循环的是时钟,那么仿真时是看不到for中变量k的变化过程的,可以理解为在时钟到达时瞬间完成对in_bit的全部赋值,这里用for循环实际上是减少了代码量,并不等同于每个时钟到达才完成一次对某位的赋值。

**记录一个关于for循环的bug:
在设计中需要对宽度为16的某寄存器赋值,使用如下语句:

for (k=0; k<16; k=k+1)
	FD[0][k] = ((0+k<128)? LFSR[0+k]:FD[0][k-128]);
	FD[1][k] = ((0+k<128)? LFSR[0+k]:FD[0][k-128]) ^ ((0+k<128)?NFSR[0+k]:FD[1][0+k-128]) ;

ISE下报错 line 242: For loop stop condition should depend on loop variable or be static.起初以为是加了判断语句,导致下标不定,于是取消了判断语句,直接书写结果,但报错依旧。转移到Vivado下编译,无综合错误,但多了一条警告:[Synth 8-324] index 16 out of range 。于是开始怀疑for语句书写的正确性,甚至以为k=16的情况仍然会执行。后来发现,是因为for循环下有多条语句,没有加begin-end导致。因为之前声明k为integer,自然会出现越界的情况。不得不说,粗心真是害人,又浪费了很长时间……

关于`define的问题

在使用`define宏定义时,应将其理解为等价替代,即标识符所在位置由define定义的常量直接取代。后续不能对define定义的常量进行运算,如加减移位等,但可以比较。如:

`define WIDTH 16
if(cnt == `WIDTH<< 3'd4)
	next_state = WORK

这里WIDTH是define的一个常量,在综合编译时16会直接替代WIDTH,但不会自动进行移位操作。这一结果已经过仿真验证,因此此处应当直接用计算好的常量代替。

关于最大频率和吞吐率的计算

电路综合时一般会配以适当的约束,这样可以通过综合结果来判断电路设计是否符合预期。而最大频率实际上就是使电路的建立时间余量为0对应的约束时钟频率。也可以理解为电路最长路径的延时。需要注意的时最大频率不等同于电路的另一个指标延迟。延迟表示电路从输入数据后产生第一个有效输出中间间隔的时间,而最大频率则表示电路可承受的最大时钟频率,如果超过这个频率,电路将因为不满足建立时间而产生时序违例。至于为什么是建立时间,理由是在前端设计中建立时间的影响更大,保持时间如果有违例可以通过工具或者后端进行修补。至于吞吐率,可以理解为单位时间电路可以处理的数据比特数,计算公式为最大频率*电路输入数据比特数(最大频率的倒数为时钟,也可以理解为单位时间内有多少个时钟边沿到达,而每到达一个边沿就会传入一次数据)。

关于设计功耗的测量

Vivado工具中具有报告功耗的功能,如下图:
在这里插入图片描述
我们关注的应当是动态功耗,至于Total Power,因为它会包含很多与我们设计自身无关的功耗(如FPGA上其他的外设),因此不予使用。类似的情况在Vivado的早期版本ISE中也有出现。

关于Slices数目的测定

Slice是Xilinx FPGA中资源消耗的单位,不同型号FPGA中Slices数目不同,每个Slice包含的LUT和FF数目也不同。之前笔者遇到问题,在综合后点击report_utilization始终得不到Slice的数目,只能得到SLICELUT和SLICEFF的数目。原以为是工具配置问题,右键表格添加项目却未找到Slice选项。后来发现,Slices数目只有在完成Implementation后才可以在report中出现,笔者推测是因为综合的本质是将代码映射为RTL电路,而实现的本质是将电路映射到FPGA的结构中,因此不完成实现是无法准确度量slice数目的,因为布局布线时也会消耗一定的资源。但在Vivado的早期版本ISE中,Synthesis后可以在面积报告中找到Slice的数目。笔者比较后发现与Implementation后的结果略有出入,但并不大,因此做出之前的猜测。

关于几个常用的快捷键

添加/取消注释:Vivado中为ctrl+/,ISE中为alt+c;
查找指定内容:ctrl + F, 可选择完全匹配或部分匹配;
局部替换: ctrl + R, 可选择在指定内容中搜索并替换;
隐藏导航栏:ctrl + Q;

综合后警告:WARNING:Xst:2677 - Node <NFSR_1> of sequential type is unconnected in block <Grain_speed_opt>.

因为某些条件使得这些节点与模块的连接无效(即未连接)
比如XX信号虽然使用always语句块定义了,但使用该XX信号的地方,由于条件没有满足、导致该XX信号没有被使用,即没有满足XX信号的使用条件,从而导致该警告提示。可以检查使用该信号的地方,检查XX信号的使用条件的使用条件是否存在错误或遗漏的地方。换言之,如果设计中某些逻辑并没有输出或者影响输出,那么综合工具会自动去除这部分逻辑以使得综合结果最优。

后续继续补充~

  • 24
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值