【Verilog高级教程】换种方式定义位宽,解读“+:“

芯片设计验证社区·芯片爱好者聚集地·硬件相关讨论社区·数字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]

它的规则如下:

  1. msb_base_exprlsb_base_expr 应为整数表达式。
  2. width_expr 应为正整数常数表达式。
  3. lsb_base_exprmsb_base_expr 可以在运行时变化。
  4. 前两个例子选择从基准位置开始的比特,并沿比特范围升序。所选择的比特数量等于宽度表达式。
  5. 后两个例子选择从基准位置开始的比特,并沿比特范围降序。

举例如下:

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

这种语法的引入大大简化了在大位宽设计中的位宽声明和选择,提高了代码的可读性和可维护性。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

张江打工人

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值