| 芯片设计验证社区·芯片爱好者聚集地·硬件相关讨论社区·数字verifier星球 |
|---|
| 四社区联合力荐!近500篇数字IC精品文章收录! |
| 【数字IC精品文章收录】学习路线·基础知识·总线·脚本语言·芯片求职·EDA工具·低功耗设计Verilog·STA·设计·验证·FPGA·架构·AMBA·书籍 |

换种方式定义位宽,解读"+:"
一、写在前面
本专栏为作者在 【数字IC手撕代码】 【数字IC笔试面经分享】 【数字IC工具解析】 以外开设的第四个独立专栏,旨在学习并提供有关Verilog硬件描述语言中非基础性的高阶语法特性知识,因本身专栏的独特定位,因此作者并不会涉及基础Verilog语言如阻塞式非阻塞赋值,过程块,数据类型等内容;同时受限于作者知识有限,本专栏也不会涉及System Verilog的相关内容,若按照IEEE的相关标准来看,本专栏将会聚焦Verilog-2005,即“IEEE Std 1364™-2005”以及之前的有关内容,提供相关的IC设计领域语法特性。以下为Verilog的进阶框图,有更多学习需求的读者可以检索相关英文标准进行学习。

二、常规位宽定义方式
通常情况下,我们通过如下的整数指定的方式来定义位宽, 同时推荐使用[msb_expr:lsb_expr],即由大到小的顺序,来进行位宽指定:
reg [15:0] big_reg; //推荐
reg [0:15] little_reg;
wire [15:0] big_vector; //推荐
wire [0:15] little_vector;
三、“+:” 和"-:"定义位宽
在一些大位宽的设计中,位宽的指定和部分选择(part-select)涉及到设计人员进行繁琐的运算,显得相当不便。
例如,假设我们声明了一个[1023:0]的寄存器 example,同时想要截取由低到高的第三个 dword,就需要手动进行运算,选择 [95:64]。
实际上,我们有一种更为方便的方式,即"+:" 或 “-:”,可以快速进行位宽选择和位宽声明。
它的表达式如下:
big_vect [lsb_base_expr +: width_expr]
little_vect [msb_base_expr +: width_expr]
big_vect [msb_base_expr -: width_expr]
little_vect [lsb_base_expr -: width_expr]
它的规则如下:
msb_base_expr和lsb_base_expr应为整数表达式。width_expr应为正整数常数表达式。lsb_base_expr和msb_base_expr可以在运行时变化。- 前两个例子选择从基准位置开始的比特,并沿比特范围升序。所选择的比特数量等于宽度表达式。
- 后两个例子选择从基准位置开始的比特,并沿比特范围降序。
举例如下:
big_vect [ 0 +: 8] // == big_vect[ 7 : 0]
big_vect [15 -: 8] // == big_vect[15 : 8]
little_vect[ 0 +: 8] // == little_vect[0 : 7]
little_vect[15 -: 8] // == little_vect[8 :15]
dword[8*sel +: 8] // variable part-select with fixed width
这种语法的引入大大简化了在大位宽设计中的位宽声明和选择,提高了代码的可读性和可维护性。
2095

被折叠的 条评论
为什么被折叠?



