Verilog电路设计小技巧之表达式位宽

–不积跬步无以至千里

记录Verilog电路设计中的点点滴滴

今天想说说verilog中表达式的位宽问题,编码过程中,经常会出现很多表达式位宽不匹配。基本上在跑lint的时候,只要一个表达式中有任意2个操作数的位宽不一致时lint都会报。但是实际上并非所有的位宽不匹配都有问题。如以下Warning:
在这里插入图片描述
在这里插入图片描述

Warning类型的意思是逻辑中存在self-determined expression,需要好好检查一下表达式的位宽是否满足逻辑要求。

有关self-determined和context-determined的定义在IEEE Verilog 2005 Spec里有详细的说明:
Verilog电路设计小技巧之表达式位宽_第1张图片
首先看一个官方给出的例子:
Verilog电路设计小技巧之表达式位宽_第2张图片
这里变量a和b都为16bit,我们定义a+b产生的临时结果(interim results)为sum_tmp,这时候sum_tmp的位宽还不是很确定。

sumA位宽16bit,则a+b结果即sum_tmp位宽16bit,如果a+b有进位则sumA无法获得正确的值;

如a=16’h8000,b=16’h8000,a+b=17’h10000,最高bit为溢出位,sumA得到的值为16’h0000。

sumB位宽17bit,则sum_tmp位宽“自适应”变为17bit。

所以双目算术运算符加(+)、减(-),它们构成的表达式的位宽就是左右操作数位宽中的最大值;

Spec中是这样描述的:
Verilog电路设计小技巧之表达式位宽_第3张图片
还有这个:
在这里插入图片描述
上述例子中加(+)、减(-)表达式就是context-determined expression,意思就是说a+b这个表达式位宽不仅仅受到变量a和b位宽的影响,同时还受到表达式“=”中其他变量的影响;

self-determined expression意志就比较坚定,它不受到其他表达式的影响,只受它自身内部的变量位宽影响。

再看一个例子:
Verilog电路设计小技巧之表达式位宽_第4张图片
或者c={ab,a+b,b(a+a)} c=b**(a+a) 此时c的位宽分别是多少呢?
在这里插入图片描述
在这里插入图片描述
首先,ab表达式中b是self_determinded,即变量b不受其他表达式影响,所以b(a+a)中(a+a)的位宽为4bit,而不受b变量位宽的影响。

c=b**(a+a)中b**(a+a)不是self-determined,其运算结果收到变量c的影响,所以b**(a+a)位宽变为16bit。

c={ab,a+b,b(a+a)}中所有的变量不受到其他变量的影响,所以ab为4bit,a+b为6bit,b(a+a)为6bit,拼接到一起为16bit。

再推导一下,如果c={ab,a+b,b(a+a),a-b},{}内所有变量拼接一起为22bit,即c只能获得运算结果的bit[15:0],bit[21:16]会丢失。这里根据我的理解是赋值语句“=”右侧变量或表达式位宽受到左侧的影响,而左侧的变量不受右侧的影响。

是不是听起来很复杂?有时候一不留神就会因为位宽不匹配引起的功能问题,这里建议长表达式分多步写,每一步位宽留够,最后按需截位,比较容易想清楚。

你可能感兴趣的:(芯片前端电路设计)