0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

关于Verilog语法你不知道的方法

FPGA之家 来源:开源博客 作者:电子电路开发学习 2021-03-21 10:01 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

动态截取固定长度数据语法,即+:和-:的使用,这两个叫什么符号呢?运算符吗?

Verilog比较方便的一个特点就是数据的截取和拼接功能了,截取使用方括号[],拼接使用大括号{},例如

reg [7:0] vect; wire a; wire [3:0] b, wire [5:0] c; assign a = vect[1]; //取其中1Bit assign b[3:0] = vect[7:4];//截取4Bit assing c[5:0] = {a, b[3:0], 1‘b1}; //拼接

于是举一反三(zi zuo cong ming),为了实现动态截取固定长度数据的功能,使用软件编程的思维写了如下语句,功能很好理解,根据cnt的值,每次截取vect的5Bit数据。:

reg [7:0] vect; reg [1:0] cnt; wire [4:0] out; assign out = vect[cnt+4:cnt];

一顿操作猛如虎,编译一看傻如狗。使用ModelSim编译之后,提示有如下语法错误:

** Error: test.v(10): Range must be bounded by constant expressions.

提示vect的范围必须为常量表达式。也就是必须为,vect[6:2]或vect[7:4],不能是vect[a:0],vect[4:b],或vect[a:b]。额,这该怎么办呢?

既然有这个使用场景,那Verilog在设计之初就应该会考虑到这个应用吧!于是就去翻IEEE的Verilog标准文档,在5.2.1章节发现了一个用法可以实现我这个需求,那就是+:和-:符号,这个用法很少,在大部分关于FPGA和Verilog书籍中都没有提到。

大致意思就是,可以实现动态截取固定长度的数据,基本语法为:

vect[base+:width]或[base-:width]

其中base可以为变量,width必须为常量。

下面来举几个例子来理解这个符号。

有如下定义:

reg [7:0] vect_1; reg [0:7] vect_2; wire [2:0] out;

以下写法分别表示什么呢?

vect_1[4+:3]; vect_1[4-:3]; vect_2[4+:3]; vect_2[4-:3];

分为三步:

1.先看定义。

vect_1[7:0]定义是大端模式,则vect_1[4+:3]和vect_1[4-:3]转换后也一定为大端模式;vect_2[0:7]定义是小端模式,则vect_2[4+:3]和vect_2[4-:3]转换后也一定为小端模式。

2.再看升降序。

其中+:表示升序,-:表示降序

3.看宽度转换。

vect_1[4+:3]表示,起始位为4,宽度为3,**升序**,则vect_1[4+:3] = vect_1[6:4] vect_1[4-:3]表示,起始位为4,宽度为3,**降序**,则vect_1[4-:3] = vect_1[4:2]

90395bd0-8925-11eb-8b86-12bb97331649.jpg

同理,

vect_2[4+:3]表示,起始位为4,宽度为3,升序,则vect_2[4+:3] = vect_2[4:6] vect_2[4-:3]表示,起始位为4,宽度为3,降序,则vect_2[4-:3] = vect_2[2:4]

90935130-8925-11eb-8b86-12bb97331649.jpg

ModelSim仿真验证,新建test.v文件:

module test; reg [7:0] vect_1; reg [0:7] vect_2; initial begin vect_1 = ’b0101_1010; vect_2 = ‘b0101_1010; $display(“vect_1[7:0] = %b, vect_2[0:7] = %b”, vect_1, vect_2); $display(“vect_1[4+:3] = %b, vect_1[4-:3] = %b”, vect_1[4+:3], vect_1[4-:3]); $display(“vect_2[4+:3] = %b, vect_2[4-:3] = %b”, vect_2[4+:3], vect_2[4-:3]); $stop; end endmodule

在ModelSim命令窗口输入:

//进入到源文件所在文件夹 cd c:/users/whik/desktop/verilog //编译 vlog test.v //仿真 vsim work.test //运行 run -all //运行结果 # vect_1[7:0] = 01011010, vect_2[0:7] = 01011010 # vect_1[4+:3] = 101, vect_1[4-:3] = 110 # vect_2[4+:3] = 101, vect_2[4-:3] = 011 # ** Note: $stop : test.v(15) # Time: 0 ps Iteration: 0 Instance: /test # Break in Module test at test.v line 15

这种语法表示需要注意,前者起始位可以是变量,后者的宽度必须是常量,即vect[idx+:cnt]不符合语法标准,vect[idx+:4]或vect[idx-:4]才符合。
编辑:lyn

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • Verilog
    +关注

    关注

    30

    文章

    1370

    浏览量

    114109
  • 编程
    +关注

    关注

    90

    文章

    3707

    浏览量

    96741

原文标题:这个Verilog语法你一定不知道

文章出处:【微信号:zhuyandz,微信公众号:FPGA之家】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    语法纠错和testbench的自动生成

    在编写Verilog代码时,我一般都是先在编辑器上写完,因为编辑器vscode或者notepad++可以提供语法高亮和自动补全等功能,然后用仿真器跑仿真,但是在编写过程中不可避免的会有一些语法的错误
    发表于 10-27 07:07

    关于OFDM 不知道的那些事?#OFDM #5G技术 #通信技术

    通信技术
    安泰仪器维修
    发布于 :2025年06月24日 18:31:22

    编译错误: error: unrecognizable insn,不知道原因,请教!

    用start_gui.exe生成的代码,再用SEGGER Embedded打开,编译有错,不知道是什么原因,请教各位大佬?
    发表于 06-23 14:45

    不知道怎么画原理图了

    时,这样的问题,也有这么多?!1、电阻的表示方法是第一种,还是第二种?中间是方框还是折线?方框做多大?现场一片混乱立马分成N派。普通的电阻都这样,这么多种电阻现
    的头像 发表于 04-30 18:40 799次阅读
    <b class='flag-5'>不知道</b>怎么画原理图了

    不知道的COB封装测试方法,快来看看推拉力测试机的应用!

    近期,有客户向小编咨询推拉力测试机,如何进行COB封装测试?在现代电子制造领域,COB(Chip on Board)封装技术因其高集成度和灵活性被广泛应用于LED、传感器、显示驱动等产品中。然而,COB封装的可靠性直接决定了产品的使用寿命和性能表现。为了确保COB封装的质量,推拉力测试成为不可或缺的环节。本文科准测控小编将详细介绍如何利用Alpha W260推拉力测试机进行COB封装的推拉力测试,以及测试过程中需要注意的关键点。 什么是COB封装工艺? COB封装
    的头像 发表于 04-03 10:42 1222次阅读
    <b class='flag-5'>你</b><b class='flag-5'>不知道</b>的COB封装测试<b class='flag-5'>方法</b>,快来看看推拉力测试机的应用!

    FPGA Verilog HDL语法之编译预处理

    Verilog HDL语言和C语言一样也提供了编译预处理的功能。“编译预处理”是Verilog HDL编译系统的一个组成部分。Verilog HDL语言允许在程序中使用几种特殊的命令(它们不是一般
    的头像 发表于 03-27 13:30 1085次阅读
    FPGA <b class='flag-5'>Verilog</b> HDL<b class='flag-5'>语法</b>之编译预处理

    DLP3010在设置时不知道如图所示的input和output指什么,这样的img文件从哪得到?

    目的是更改开机图片,在设置时不知道如图所示的input和output指什么,这样的img文件从哪得到? 以下是各页设置情况,GUI使用的是3.1.0.3,EVM是2.2.0.6
    发表于 02-25 07:23

    关于TI集成电路命名标识那些不知道的事儿

    集成电路
    芯广场
    发布于 :2025年01月21日 17:47:40

    关于射频导纳物位开关不知道的知识点

    它作为一种重要的工业自动化设备,在生产领域中扮演者重要的角色,这款物位仪表就是射频导纳物位开关,它可以用于测量和控制物料的位置和数量。它之所以受欢迎是因为产品的防刮料功能好、测量数值准确、适用的范围广,能够帮助工业生产领域的人们有效的解决一些传统物位开关的限制问题。 这款物位开关的稳定性高、测量数值准、适用场合多等优点,且他还能配备报警指示灯等功能,能够让用户更为直观的获取到它测量出来的数值信息,方便
    的头像 发表于 01-21 13:56 784次阅读
    <b class='flag-5'>关于</b>射频导纳物位开关<b class='flag-5'>你</b><b class='flag-5'>不知道</b>的知识点

    ADS805E测量跳跃幅度很大,不知道是为什么?

    我按照手册上直流耦合连接电路,输入是1.5V~3.5V范围,SEL与VREF相连,用430定时器输出转换时钟,结果测量直流时,AD测量结果在几个值之间跳跃,跳跃幅度很大,不知道是为什么,引脚电压控制用3.3V。
    发表于 01-21 07:46

    测的值不定然后开始减小直到为0,不知道怎么回事?

    ADS1247对寄存器可读可写 可是配置完02这个地址的时(写0x30)在vrefout测不到2.048v,测的值不定然后开始减小直到为0,不知道怎么回事?
    发表于 01-21 06:27

    压力变送器接线方法不知道

    压力变送器
    jzyb
    发布于 :2024年12月18日 10:44:17

    Verilog 测试平台设计方法 Verilog FPGA开发指南

    Verilog测试平台设计方法Verilog FPGA开发中的重要环节,它用于验证Verilog设计的正确性和性能。以下是一个详细的Verilog
    的头像 发表于 12-17 09:50 1558次阅读

    Verilog与VHDL的比较 Verilog HDL编程技巧

    Verilog 与 VHDL 比较 1. 语法和风格 VerilogVerilog语法更接近于 C 语言,对于有 C 语言背景的工程
    的头像 发表于 12-17 09:44 2679次阅读

    有关UV固化不知道的技术细节

    UV固化技术中,光引发剂吸收UV光产生活性自由基触发聚合反应,包括链引发、增长、终止和交联。反应速率受UV光强、光引发剂浓度、单体类型等因素影响,UV固化技术具有快速固化特性。
    的头像 发表于 12-06 09:33 1446次阅读