Verilog初级教程(4)Verilog中的标量与向量
博文目录
- 写在前面
- 正文
- 标量与变量
- 位选择
- 常见错误
- 参考资料
- 交个朋友
写在前面
上一篇博文就说到了Verilog的数据类型,其中就常用的就是reg类型以及wire类型,这两种类型可以定义一位的变量也可以定义多位的变量,其中一位称之为标量,多位称之为向量,类似于数组。本篇博客主要讲述对多位变量的一些操作。
例如:
Verilog 2001修订版新增的bit位选择语法:
[<start_bit> +: <width>] // part-select increments from start-bit
[<start_bit> -: <width>] // part-select decrements from start-bit
- 个人微信公众号: FPGA LAB
正文
标量与变量
Verilog需要表示单个位以及多个位的组。例如,一个单bit时序元件是一个触发器。然而一个16位的时序元件是一个可以容纳16位的寄存器。为此,Verilog有标量和矢量网以及变量。
一个没有指定范围的net或reg声明被认为是1位宽,是一个标量。如果指定了范围,那么net或reg就变成了一个多比特的实体,称为向量。
wire o_nor; // single bit scalar netwire [7:0] o_flop; // 8-bit vector netreg parity; // single bit scalar variablereg [31:0] addr; // 32 bit vector variable to store address
范围提供了在一个向量中寻址单个位的能力。向量中最高位应该被指定为范围内的左手值,而向量中最低位应该被指定在右手边。
wire [msb:lsb] name;integer my_msb;wire [15:0] priority; // msb = 15, lsb = 0wire [my_msb: 2] prior; // illegal
在上面的例子中,将创建一个16位宽的网,称为优先级。注意,msb和Isb应该是一个常量表达式,不能用变量代替。
注:msb以及lsb可以是任何整数值–正负或零,而且Isb的值可以大于、等于或小于msb的值。但为了保持风格统一,也就是左边的值要比右边的值大,所以不建议lsb大于或等于msb.
位选择
向量中的任意位都可以被单独选择,并且可以对其单独赋值。
如:
reg [7:0] addr; // 8-bit reg variable [7, 6, 5, 4, 3, 2, 1, 0]addr [0] = 1; // assign 1 to bit 0 of addraddr [3] = 0; // assign 0 to bit 3 of addr
操作后的示意图:
但不能超出向量索引范围:
addr [8] = 1; // illegal : bit8 does not exist in addr
能单个位选择,当然也能范围选择,也即连续选择相邻的多位进行赋值等操作。
例如:
reg [31:0] addr;addr [23:16] = 8'h23; // bits 23 to 16 will be replaced by the new value 'h23 -> constant part-select
上面多位选择,采用的是常量作为索引值。
还可以使用如下的方式:
[<start_bit> +: <width>] // part-select increments from start-bit
[<start_bit> -: <width>] // part-select decrements from start-bit
拥有一个可变的部分选择,可以在循环中有效地使用它来选择矢量的部分。虽然起始位可以改变,但宽度必须是恒定的。
例如:
module des;reg [31:0] data;int i;initial begindata = 32'hFACE_CAFE;for (i = 0; i < 4; i++) begin$display ("data[8*%0d +: 8] = 0x%0h", i, data[8*i +: 8]);end$display ("data[7:0] = 0x%0h", data[7:0]);$display ("data[15:8] = 0x%0h", data[15:8]);$display ("data[23:16] = 0x%0h", data[23:16]);$display ("data[31:24] = 0x%0h", data[31:24]);endendmodule
仿真结果:
ncsim> run
data[8*0 +: 8] = 0xfe // ~ data [8*0+8 : 8*0]
data[8*1 +: 8] = 0xca // ~ data [8*1+8 : 8*1]
data[8*2 +: 8] = 0xce // ~ data [8*2+8 : 8*2]
data[8*3 +: 8] = 0xfa // ~ data [8*3+8 : 8*3]data[7:0] = 0xfe
data[15:8] = 0xca
data[23:16] = 0xce
data[31:24] = 0xfa
ncsim: *W,RNQUIE: Simulation is complete.
常见错误
举例:
module tb;reg [15:0] data;initial begin$display ("data[0:9] = 0x%0h", data[0:9]); // Error : Reversed part-select index expression orderingend
endmodule
这个常见的错误,就是混用msb以及lsb的风格导致的,再次强调,统一风格,msb在做,lsb在右!
参考资料
- 参考资料1
- 参考资料2
交个朋友
个人微信公众号:FPGA LAB
知乎:李锐博恩
FPGA/IC技术交流2020
Verilog初级教程(4)Verilog中的标量与向量相关推荐
- Verilog初级教程(23)Verilog仿真中的显示任务
文章目录 前言 正文 Display/Write Tasks Verilog Strobes Verilog Continuous Monitors Verilog Format Specifiers ...
- Verilog初级教程(21)Verilog中的延迟控制语句
文章目录 前言 正文 延迟控制语句 事件控制语句 Named Events Event or operator 往期回顾 参考资料及推荐关注 前言 Verilog中的延迟控制有两种类型–延迟和事件表达 ...
- Verilog初级教程(20)Verilog中的`ifdef 条件编译语句
文章目录 前言 正文 语法 示例 Testbench文件 往期回顾 参考资料及推荐关注 前言 `ifdef条件编译语句在逻辑设计中还是很常见的,但也常见一些滥用的情况,这应该避免. 应该在什么情况下使 ...
- Verilog初级教程(15)Verilog中的阻塞与非阻塞语句
文章目录 前言 正文 阻塞赋值 非阻塞赋值 往期回顾 参考资料以及推荐关注 前言 本文通过仿真的方式,形象的说明阻塞赋值以及非阻塞赋值的区别,希望和其他教程相辅相成,共同辅助理解. 正文 阻塞赋值 阻 ...
- Verilog初级教程(14)Verilog中的赋值语句
文章目录 前言 正文 合理的左值 过程性赋值(Procedural assignment) 连续赋值 过程连续性赋值 往期回顾 前言 何为赋值语句?即将值放到线网或者变量上,这种操作称为赋值,英文:a ...
- Verilog初级教程(12)Verilog中的generate块
文章目录 前言 正文 generate for generate if generate case 参考资料 本系列博文 前言 verilog中的generate块可以称为生成块,所谓生成,可以理解为 ...
- Verilog初级教程(11)Verilog中的initial块
文章目录 前言 正文 语法格式 initial块是用来干什么的? initial块何时开始又何时结束? 一个模块中允许有多少个initial块? 参考资料 写在最后 前言 仿真中通常会依次执行一组Ve ...
- Verilog初级教程(19)Verilog中的参数
文章目录 前言 正文 模块参数 覆盖参数 例子说明 递增计数器 递减计数器 Specify参数 模块参数与Specify参数的区别 往期回顾 参考资料及推荐关注 前言 Verilog中的参数是使得设计 ...
- Verilog初级教程(16)Verilog中的控制块
文章目录 前言 正文 条件语句if 语法 硬件实现 循环语句 forever repeat while for 往期回顾 参考资料及推荐关注 前言 硬件行为的实现离不开条件语句和其他控制逻辑流的方式. ...
- Verilog初级教程(9)Verilog的运算符
博文目录 写在前面 正文 Verilog算术运算符 Verilog关系运算符 Verilog等价运算符 Verilog逻辑运算符 Verilog位元运算符 Verilog移位运算符 参考资料 交个朋友 ...
最新文章
- make: *** [ext/fileinfo/libmagic/apprentice.lo] Er
- centos 8 rpm yum install_关于yum不能正常使用的解决方案
- jvm内存结构_浅谈JVM内存结构
- nodejs的PM2进程管理
- Bootstrap3 插件的选项
- Linux:如何更新Ubuntu的数据源
- linux 默认文件属性,linux - 文件夹、文件默认属性: umask使用
- (转载)PHP 判断常量,变量和函数是否存在
- Linux下Java安装与配置
- wps 甘特图_项目管理/产品研发/建设施工/计划生成项目进度甘特图表教程
- 010editor的破解
- 7723java异形_7723-14-0
- 利用接口检查日期是否为法定节假日
- Excel的类、方法和Excel操作
- Xilinx MIG IP核app_wdf_rdy信号一直为低
- cocos2d 高德地图_高德地图SDK使用经验
- Linux 系统查看服务器SN序列号以及服务器型号
- 怀念—伤心者,不痛不痒,冷暖自知
- 我学ERP 之 金蝶ERP-K3_第4章 销售管理
- 【python】简单使用selenium编写无界面谷歌浏览器的网页登录和签到功能