Verilog基础:操作数的位选(bit-select)和域选(part select)

news2024/9/22 19:45:35

相关阅读

Verilog基础icon-default.png?t=N7T8https://blog.csdn.net/weixin_45791458/category_12263729.html?spm=1001.2014.3001.5482


位选

        位选(bit-select)用于选择一个向量(vector)的某位,可以是线网大类(net),也可以是变量大类(variable)中的reg、integer和time(注意:real和realtime不可以位选)。

        位选的语法如下所示。

vector [expression]

         如果位选expression的结果超出vector的范围或者位选expression的结果包含x或z,则位选作为右值计算的结果是x,仿真器会给出警告,如下例所示。

module test();
    reg [2:0] a = 3'b101;
    reg b = 1'b1;

    initial #1 $display("a[0] is %d", a[0]);        //a[0] is 1
    initial #1 $display("a[b] is %d", a[b]);        //a[b] is 0
    initial #1 $display("a[1'bx] is %d", a[1'bx]);  //a[1'bx] is x
    initial #1 $display("a[3] is %d", a[3]);        //a[3] is x
endmodule

        如果位选expression的结果超出vector的范围或者位选expression的结果包含x或z,则位选作为左值不会有任何作用,仿真器会给出警告,如下例所示。 

module test();
  reg [2:0] a = 3'b000;
  initial #1 begin a[3]=1'b1;a[1'bx]=1'b1;end
  initial #2 $display(a is "%b",a); // a is 000
endmodule

域选

        域选(part select)用于选择一个向量(vector)的连续某几位,该向量可以是线网大类(net),也可以是变量大类(variable)中的reg、integer和time(注意:real和realtime不可以域选)。

        域选有两种形式,常量域选和索引域选(Verilog 2001标准引入),下面分别进行说明。

常量域选

        常量域选的语法如下所示。

vector [msb_expr : lsb_expr]

        其中msb_expr和lsb_expr都必须计算为常量。msb_expr和lsb_expr的相对大小,需要符合vector定义时msb_expr和lsb_expr的相对大小,如下例所示。

module test();
    reg [4:0] b = 5'b01010;     //msb(left hand) is greater than lsb(right hand)
    reg [0:4] a = 5'b01010;     //msb(left hand) is less than lsb(right hand)

    initial #1 $display("b[1:0] is %b", b[1:0]);  //right, select lsb 2 bits, 10
    initial #1 $display("b[1:0] is %b", b[0:1]);  //false, msb(left hand) should be greater than lsb(right hand)
    initial #1 $display("a[1:0] is %b", a[3:4]);  //right, select lsb 2 bits, 10
    initial #1 $display("a[1:0] is %b", a[4:3]);  //false, msb(left hand) should be less than lsb(right hand)
endmodule

        msb_expr和lsb_expr可以相等,此时相当于位选,如下例所示。

module test();  
    reg [4:0] b = 5'b01010;;    

    initial #1 $display("b[1] is %b", b[1]);  //right bit-select, 1
    initial #1 $display("b[1:1] is %b", b[1:1]);  //right part-select, 1
endmodule

        如果域选作为右值超出界限,则超出界限的部分为x,这是多数仿真器的处理方式,但也有仿真器选择让所有结果为x,不管如何处理,仿真器会给出警告,如下例所示。 

module test();
    reg [4:0] b = 5'b01010;;    
    initial #1 $display("b[5:-1] is %b", b[5:-1]);  //x01010x for most simulator
endmodule

// x01010x
Mentor Modelsim SE
Aldec Riviera Pro
Mentor Questa
Synopsys VCS
Icarus Verilog

// xxxxxx
Cadence Xcelium

        如果域选作为左值超出界限,则超出界限的位不会写入,只有界限中的位会被写入,这是多数仿真器的处理方式,但也有仿真器选择不进行任何写入,不管如何处理,仿真器会给出警告,如下例所示。

module test();
  reg [2:0] a = 3'b000;
  initial #1 begin a[2:-1]=4'b1100;end
  initial #2 $display("%b",a);
endmodule

// 110
Mentor Modelsim SE
Aldec Riviera Pro
Mentor Questa
Synopsys VCS
Icarus Verilog

// 000
Cadence Xcelium

        如果msb_expr或lsb_expr出现了x或z,则仿真器会报错。 

索引域选

        索引域选的语法如下所示。

reg [15:0] big_vector;
reg [0:15] little_vector;

big_vector    [lsb_base_expr +: width_expr]
little_vector [msb_base_expr +: width_expr]
big_vector    [msb_base_expr -: width_expr]
little_vector [lsb_base_expr -: width_expr]

        可以看出,根据向量msb_expr和lsb_expr的相对大小,索引域选的解释方式不同。但都由两部分组成,base表达式可以是一个非常量表达式,width表达式必须是一个常量表达式,即可以动态索引固定数量的位,下面给出了一些等价写法。

reg [15:0] big_vector;
reg [0:15] little_vector;
reg a=0;
reg b=5;

******************
big_vector [5:0]  
big_vector [a+:6]
******************
big_vector [5:0]  
big_vector [b-:6]
******************
little_vector [0:5]
little_vector [a+:6]
******************
little_vector [0:5]
little_vector [b-:6]

        索引域选的越界问题和常量域选是一样处理的,因为它们本来就是可互相转换的。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1921495.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Redis 主从复制,哨兵与集群

目录 一.redis主从复制 1.redis 主从复制架构 2.主从复制特点 3.主从复制的基本原理 4.命令行配置 5.实现主从复制 6.删除主从复制 7.主从复制故障恢复 8.主从复制完整过程 9.主从同步优化配置 二.哨兵模式(Sentinel) 1.主要组件和概念 2.哨…

半小时获得一张ESG入门证书【详细中英文笔记一】

前些日子,有朋友转发了一则小红书的笔记给我, 标题是《半小时获CFI官方高颜值免费证书 ESG认证》。这对考证狂魔的我来说,必然不能错过啊,有免费的羊毛不薅白不薅。 ESG课程的 CFI 官方网址戳这里:CFI 于是信心满满的…

Electron运行报错:Error Cannot find module ‘node_moduleselectroncli.js‘

Electron运行报错:Error: Cannot find module ‘node_modules\electron\cli.js’ 顾名思义,命令行执行Electron .时候,会优先从项目目录查找对应依赖,如果是报错显示是找不到项目目录下的依赖,我们可以从安装在全局的…

轮转数组(时间复杂度不同的三种思路)

(来源:LeetCode) 题目 分析 其实一次轮转就是将最后一个数据放到最前面,其他数据整体向后移动一位。k为几就重复这个行为几次。 思路1 我们应该很快能想到最直接的一种思路。while(k--)……循环内完成两件事,保存最…

【C++】函数重载详解

📢博客主页:https://blog.csdn.net/2301_779549673 📢欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正! 📢本文由 JohnKi 原创,首发于 CSDN🙉 📢未来很长&#…

Python面试全攻略:基础知识、特性、算法与实战解析

随着Python的普及,越来越多的人开始学习Python并尝试在面试中展示自己的技能。在这篇文章中,我们将探讨Python面试需要注意的问题以及一些经典的Python算法。 一、Python面试需要注意的问题 基础知识 在Python面试中,基础知识是非常重要的。…

开源浪潮:助力未来科技的飞速发展

文章目录 开源项目有哪些机遇与挑战?开源项目的发展趋势发展现状开源社区的活跃度 我是如何参与开源项目的经验分享选择开源项目贡献代码 开源项目的挑战开源项目面临的挑战 开源项目有哪些机遇与挑战? 随着全球经济和科技环境的快速变化,开源…

设计模式 - 最简单最有趣的方式讲述

别名《我替你看Head First设计模式》 本文以故事的形式带你从0了解设计模式,在其中你仅仅是一名刚入职的实习生,在项目中摸爬滚打。(以没有一行真正代码的形式,让你无压力趣味学习) 设计模式 策略模式观察者模式装饰者…

【简历】重庆某一本大学:JAVA简历指导,中厂通过率较低

注:为保证用户信息安全,姓名和学校等信息已经进行同层次变更,内容部分细节也进行了部分隐藏 简历说明 这是一份重庆某一本大学Java同学的简历。那么因为学校是一个一本的学校,就先要确定就业层次在中厂或者大厂,但是…

Zed 编辑器发布了原生 Linux 版本

由 Rust 编写、GPU 加速的 Zed 文本编辑器终于提供了正式的 Linux 原生版本!在过去的几个月里,Zed 的 Linux 支持取得了长足的进步,现在已经进入了更正式的阶段。 今天,这款由前 Atom 开发人员创建的现代开源代码编辑器现在在 Li…

算法的几种常见形式

算法(Algorithm) 算法(Algorithm)是指解决问题或完成任务的一系列明确的步骤或规则。在计算机科学中,算法是程序的核心部分,它定义了如何执行特定的任务或解决特定的问题。算法可以用多种方式来表示和实现…

如何在小红书上面有效地种草?

文末领取小红书电商开店运营教程! 小红书是一个以内容分享为主的社交平台,大家喜欢在这里分享自己的生活体验和心得,其中就包括各种产品的使用感受。 那么我们要想在小红书上有效地种草,首先就需要了解并掌握小红书的种草文化。 …

JavaScript(8)——函数

函数 function,是被设计执行特定任务的代码块。 函数可以把具有相同或相似逻辑的代码包裹起来,通过函数调用执行这些代码,这么做的优势有利于精简代码方便复用。类似于alert(),prompt()和console.log(),这些都是js函数,不过已经…

C++学习书籍推荐

第一本:C Primer CPrimer:主要讲解语法,经典的语法书籍,前后中期都可以看,前期如果⾃学看可能会有点晦涩 难懂,能看懂多少看懂多少,就当预习,中后期作为语法字典,⾮常好⽤…

Android11 SplashScreen 的显示和退出流程

应用的启动到显示到屏幕是需要一定的时间的,为了提升用户的体验,google加入了启动窗口,也就是SplashScreen SplashScreen显示流程 在应用的启动过程中,会调用到ActivityStarter的startActivityInner方法,具体可参考&a…

STM32HAL库+ESP8266+cJSON+微信小程序_连接华为云物联网平台

STM32HAL库ESP8266cJSON微信小程序_连接华为云物联网平台 实验使用资源:正点原子F407 USART1:PA9P、A10(串口打印调试) USART3:PB10、PB11(WiFi模块) DHT11:PG9(采集数据…

【JavaEE精炼宝库】文件操作(2)——文件内容读写 | IO流

文章目录 一、输入流1.1 InputStream 概述:1.2 read 方法详解:1.3 close 方法:1.4 利用 Scanner 进行读操作:1.5 Reader: 二、输出流2.1 OutputStream 概述:2.2 write 方法详解:2.3 利用 PrintW…

【Sql Server】sql server 2019设置远程访问,外网服务器需要设置好安全组入方向规则

大家好,我是全栈小5,欢迎来到《小5讲堂》。 这是《Sql Server》系列文章,每篇文章将以博主理解的角度展开讲解。 温馨提示:博主能力有限,理解水平有限,若有不对之处望指正! 目录 前言1、无法链接…

47、lvs之DR

1、DR模式: 1.1、lvs三种模式: nat 地址转换 DR 直接路由模式 tun 隧道模式 1.2、DR模式的特点: 调度器在整个lvs集群当中是最重要的,在nat模式下,即负载接收请求,同时根据负载均衡的算法转发流量&…

2024 China Joy 前瞻 | 腾讯网易发新作,网易数智携游戏前沿科技、创新产品以及独家礼盒,精彩不断!

今年上半年,CES、MWC和AWE三大国际科技展轮番轰炸,吸引全球科技爱好者的高度关注,无论是新潮的科技产品,还是对人工智能的探索,每一项展出的技术和产品都引起了市场的热议。而到了下半年,一年一度的China J…