博文目录

  • 写在前面
  • 正文
    • 标量与变量
    • 位选择
    • 常见错误
  • 参考资料
  • 交个朋友

写在前面

上一篇博文就说到了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中的标量与向量相关推荐

  1. Verilog初级教程(23)Verilog仿真中的显示任务

    文章目录 前言 正文 Display/Write Tasks Verilog Strobes Verilog Continuous Monitors Verilog Format Specifiers ...

  2. Verilog初级教程(21)Verilog中的延迟控制语句

    文章目录 前言 正文 延迟控制语句 事件控制语句 Named Events Event or operator 往期回顾 参考资料及推荐关注 前言 Verilog中的延迟控制有两种类型–延迟和事件表达 ...

  3. Verilog初级教程(20)Verilog中的`ifdef 条件编译语句

    文章目录 前言 正文 语法 示例 Testbench文件 往期回顾 参考资料及推荐关注 前言 `ifdef条件编译语句在逻辑设计中还是很常见的,但也常见一些滥用的情况,这应该避免. 应该在什么情况下使 ...

  4. Verilog初级教程(15)Verilog中的阻塞与非阻塞语句

    文章目录 前言 正文 阻塞赋值 非阻塞赋值 往期回顾 参考资料以及推荐关注 前言 本文通过仿真的方式,形象的说明阻塞赋值以及非阻塞赋值的区别,希望和其他教程相辅相成,共同辅助理解. 正文 阻塞赋值 阻 ...

  5. Verilog初级教程(14)Verilog中的赋值语句

    文章目录 前言 正文 合理的左值 过程性赋值(Procedural assignment) 连续赋值 过程连续性赋值 往期回顾 前言 何为赋值语句?即将值放到线网或者变量上,这种操作称为赋值,英文:a ...

  6. Verilog初级教程(12)Verilog中的generate块

    文章目录 前言 正文 generate for generate if generate case 参考资料 本系列博文 前言 verilog中的generate块可以称为生成块,所谓生成,可以理解为 ...

  7. Verilog初级教程(11)Verilog中的initial块

    文章目录 前言 正文 语法格式 initial块是用来干什么的? initial块何时开始又何时结束? 一个模块中允许有多少个initial块? 参考资料 写在最后 前言 仿真中通常会依次执行一组Ve ...

  8. Verilog初级教程(19)Verilog中的参数

    文章目录 前言 正文 模块参数 覆盖参数 例子说明 递增计数器 递减计数器 Specify参数 模块参数与Specify参数的区别 往期回顾 参考资料及推荐关注 前言 Verilog中的参数是使得设计 ...

  9. Verilog初级教程(16)Verilog中的控制块

    文章目录 前言 正文 条件语句if 语法 硬件实现 循环语句 forever repeat while for 往期回顾 参考资料及推荐关注 前言 硬件行为的实现离不开条件语句和其他控制逻辑流的方式. ...

  10. Verilog初级教程(9)Verilog的运算符

    博文目录 写在前面 正文 Verilog算术运算符 Verilog关系运算符 Verilog等价运算符 Verilog逻辑运算符 Verilog位元运算符 Verilog移位运算符 参考资料 交个朋友 ...

最新文章

  1. make: *** [ext/fileinfo/libmagic/apprentice.lo] Er
  2. centos 8 rpm yum install_关于yum不能正常使用的解决方案
  3. jvm内存结构_浅谈JVM内存结构
  4. nodejs的PM2进程管理
  5. Bootstrap3 插件的选项
  6. Linux:如何更新Ubuntu的数据源
  7. linux 默认文件属性,linux - 文件夹、文件默认属性: umask使用
  8. (转载)PHP 判断常量,变量和函数是否存在
  9. Linux下Java安装与配置
  10. wps 甘特图_项目管理/产品研发/建设施工/计划生成项目进度甘特图表教程
  11. 010editor的破解
  12. 7723java异形_7723-14-0
  13. 利用接口检查日期是否为法定节假日
  14. Excel的类、方法和Excel操作
  15. Xilinx MIG IP核app_wdf_rdy信号一直为低
  16. cocos2d 高德地图_高德地图SDK使用经验
  17. Linux 系统查看服务器SN序列号以及服务器型号
  18. 怀念—伤心者,不痛不痒,冷暖自知
  19. 我学ERP 之 金蝶ERP-K3_第4章 销售管理
  20. 【python】简单使用selenium编写无界面谷歌浏览器的网页登录和签到功能

热门文章

  1. 两个集合相减怎么算_2集合的基本运算
  2. 天边一朵云-最终章动画化决定,看云卷云舒
  3. [读书笔记] 代码整洁之道(一)
  4. 如何写出高性能代码(四)优化数据访问
  5. Burp Suite进行账号密码爆破
  6. 34-电影排行榜上(布局界面)
  7. 女朋友学计算机送什么礼物好,送经常面对电脑的女生什么礼物?
  8. PowerMILL宏自动化编程教程
  9. 对Restful的理解
  10. JavaScript 探查器工具