systemverilog中位的选择

ops/2024/10/22 8:32:40/

常用的变量类型就是 reg 和 wire ,这两种类型可以定义 一位的变量,也可以定义多位,其中 1 bit 的变量称为 标量(scalar),多 bit 的变量称为 向量(vector),如下所示:

wire        o_nor;           // single bit scalar net
wire [7:0]  o_flop;          // 8-bit vector net
reg         parity;          // single bit scalar variable
reg  [31:0] addr;            // 32 bit vector variable to store address

向量的多 bit 范围为我们提供了对其中若干 bit 寻址的能力,向量中的最高位称为 msb ,而最低位称为 lsb,如下:

wire  [msb:lsb]   name;
integer           my_msb;wire [15:0]        priority;      // msb = 15, lsb = 0
wire [my_msb: 2]   prior;         // illegal

不管是定义 wire 还是 reg 类型,其 msb 和 lsb 都必须是常量表达式,而不能是变量!!如上面的定义 prior 时其 msb 为变量,这种情况是非法非!!

注: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 addr
addr [3] = 0;                // assign 0 to bit 3 of addr

当然也能进行连续多个 bit 的选择以及赋值:

eg [31:0]    addr;addr [23:16] = 8'h23;         // bits 23 to 16 will be replaced by the new value 'h23 -> constant part-select

上面的位选择采用的是以常量表达式作为索引值,其实 verilog 支持起始值为变量的位选择,如下:

[<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.


http://www.ppmy.cn/ops/7451.html

相关文章

杀死那个名为360安全的软件

背景 2023年底&#xff0c;闲来没事想起了xjun师傅2021年发的procexp驱动利用帖子时在群里讨论的&#xff0c;通过procexp驱动突破PPL后注入到csrss进程中&#xff0c;再通过csrss来结束那些个安全防护软件。于是在当时就有了如下成果&#xff1a; 这些弄完之后&#xff0c;觉…

flutter 实现表单的封装包含下拉框和输入框

一、表单封装组件实现效果 //表单组件 Widget buildFormWidget(List<InputModel> formList,{required GlobalKey<FormState> formKey}) {return Form(key: formKey,child: Column(children: formList.map((item) {return Column(crossAxisAlignment: CrossAxisAlig…

AttributeError: module ‘backend_interagg‘ has no attribute ‘FigureCanvas‘.

问题1&#xff1a; AttributeError: module backend_interagg has no attribute FigureCanvas. 解决方案&#xff1a; import matplotlib matplotlib.use(Agg) # 选择合适的后端&#xff0c;如Aggimport matplotlib.pyplot as plt在你的代码开头加上这两行代码&#xff0c;…

Redis 逻辑过期策略设计思路

引言&#xff1a; 当我们平常使用Redis缓存的时候&#xff0c;会出现一种场景&#xff0c; redis的key到过期时间了&#xff0c;总是需要到数据库里面去查一遍数据再set回redis&#xff0c;这个时候如果数据库响应比较慢&#xff0c;那么就会造成用户等待&#xff0c;如果刚好…

Ant Design中Tree使用defaultExpandAll属性后不会默认展开所有节点怎么办?

最近做前端项目时&#xff0c;使用到了 tree 组件&#xff0c;选择使用 Ant Design 中的 tree 组件&#xff0c;默认所有节点初始时全部展开&#xff0c;使用 defaultExpandAll 属性。但是显示的时候&#xff0c;一个节点都没展开。于是调研了一下这个问题。发现有以下问题&…

深入解析Tomcat的工作流程

tomcat解析 Tomcat是一个广泛使用的开源Servlet容器&#xff0c;用于托管Java Web应用程序。理解Tomcat的工作流程对于开发人员和系统管理员来说是非常重要的。本文将深入探讨Tomcat的工作原理&#xff0c;包括请求处理、线程池管理、类加载、以及与Web服务器之间的通信。 ###…

安全访问服务边缘(SASE):网络新时代的安全与连接解决方案

随着信息技术的飞速发展&#xff0c;在企业纷纷拥抱数字业务的过程中&#xff0c;由于边缘计算、云服务、混合网络的逐渐兴起&#xff0c;使得本就漏洞百出的传统网络安全架构更加岌岌可危&#xff0c;企业和组织面临着日益复杂且多变的网络安全挑战。传统的网络安全解决方案往…

Flutter - iOS 开发者速成篇

首先 安装FLutter开发环境&#xff1a;M1 Flutter SDK的安装和环境配置 然后了解Flutter和Dart 开源电子书&#xff1a;Flutter实战 将第一章初略看一下&#xff0c;你就大概了解一下Flutter和Dart这门语言 开始学习Dart语言 作为有iOS经验的兄弟们&#xff0c;学习Dart最快…