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

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

3天内不再提示

Verilog中的赋值语句的区别

电子设计 来源:博客园 作者:nanoty 2020-11-26 10:04 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

1. 连续赋值语句(Continuous Assignments)

连续赋值语句是Verilog数据流建模的基本语句,用于对线网进行赋值,等价于门级描述,是从更高的抽象角度来对电路进行描述。连续赋值语句必须以关键词assign开始。

连续复制的主要特点是:

连续赋值语句的左值可以是一下类型之一:
①标量线网
②向量线网
③矩阵中的一个元素(该矩阵可以是标量线网类型的,也可以是向量线网类型的)
④向量线网的某一位
⑤向量线网的部分位

以及上述各种类型的拼接体

但是,不能是向量或向量寄存器

连续赋值语句总是处于激活状态。只要任意一个操作数发生变化,表达式就会被立即重新计算,并且将结果赋给等号左边的线网。
操作数可以是标量或向量的线网或寄存器,也可以是函数的调用。
赋值延迟用于控制对线网赋予新值的时间,根据仿真时间单位进行说明。赋值延迟类似于门延迟,对于描述实际电路中的时序是非常重要的。

2. 过程赋值语句(Procedural Assignments)

过程赋值语句的更新对象是寄存器、整数、实数或时间变量等。这些类型的变量在被赋值后,其值将保持不变,直到被其他过程赋值语句赋予新值。过程赋值语句只有在执行到的时候才会起作用。过程赋值语句只能在initial或always语句内进行赋值,只能对变量数据类型赋值,同时initial和always中只能使用过程赋值语句。

过程赋值语句的左值可以是以下类型之一:

①reg、整形数、实型数、时间寄存器变量或存储器单元

②上述各种类型的位选(例如:addr[3])

③上述各种类型的域选(例如:addr[31:16])

④上面三种类型的拼接

过程性赋值语句包括两种类型的赋值语句:阻塞赋值(=)和非阻塞赋值(<=)(其主要区别详见各类Verilog参考书,这里不再详述)。

3. 过程连续赋值语句(Procedural Continuous Assignments)

过程连续赋值是在过程块内对变量或线网型数据进行连续赋值,是一种过程性赋值,换言之,过程性连续赋值语句是一种能够在always或initial语句块中出现的语句。这种赋值可以改写(Override)所有其他语句对线网或者变量的赋值。这种赋值允许赋值表达式被连续的驱动进入到变量或线网中去。

过程连续赋值语句有两种类型:

①assign和deassign过程性语句:对变量进行赋值。

②force和release过程性语句:主要用于对线网赋值,也可以用于对变量赋值。

3.1 assign和deassign语句

assign和deassign语句构成了一类过程性连续赋值语句,只能用于对寄存器类型变量的连续赋值操作,不能用来对线网类型数据进行连续赋值操作。

①assign语句

语法:assign <寄存器类型变量> =<赋值表达式>;

assign在执行时,寄存器类型变量将由赋值表达式进行连续驱动,即进入连续赋值状态。如果此时有普通的过程赋值语句对该寄存器变量进行过程赋值操作,由于过程连续赋值语句assign的优先级高于普通过程赋值语句,所以出于连续赋值状态的寄存器变量将忽略普通过程赋值语句对它的过程赋值操作,其逻辑状态仍然由过程连续赋值语句内的赋值表达式所决定。

如果先后有两条assign语句对同一寄存器变量进行了过程连续赋值操作,那么第二条assign的执行将覆盖第一条assign的执行效果。

②deassign语句

语法:deassign <寄存器类型变量>;

deassign语句是一条撤销连续赋值语句,用来结束对变量的连续赋值操作。当deassign语句执行后,原来由assign语句对该变量进行的连续赋值操作将失效,寄存器变量被连续赋值的状态将得到解除,该变量又可以由普通过程赋值语句进行赋值操作了。这里需要注意一点,当执行该语句撤销对某寄存器变量的连续赋值后,该寄存器变量仍将保持使用该语句之前的原有值。

③示例:

上述语句执行过程如下:

s0:在0时刻,out被赋值为0,并且保持这个取值;

s1:在10时刻,s1开始执行,实现了对变量out的连续赋值操作,因此从10时刻开始,out将处于连续赋值状态;

s2:在20时刻,s2开始执行,将覆盖s1产生的作用,所以从20时刻开始,out将由c & d连续驱动;

s3:s3操作覆盖掉s2操作;

s4:当deassign语句得到执行,变量out连续赋值状态被解除,其取值将保持最后一次assign语句赋予的值,即“e & f”;

3.2 force和release语句

force和release语句与assign和deassign语句类似,也是一种过程连续赋值语句。这组赋值语句不仅能对寄存器类型变量产生作用,还能对线网类型数据进行连续赋值操作。

①force语句

语法:force <寄存器变量或者线网数据> = <赋值表达式>>;

force语句应用于寄存器类型变量时,则在force语句执行后,该寄存器变量将强制由进行连续驱动,进入被连续赋值的状态,此时将忽略其他较低优先级的赋值语句对该寄存器变量的赋值操作,直到执行一条release语句来释放对该寄存器变量的连续赋值为止。

force语句应用于线网数据时,则force语句执行后,对应的线网数据将得到的连续驱动,此时将忽略该线网数据上较低优先级的驱动,直到有一条release语句执行为止。

②release语句

语法:release <寄存器变量或者线网数据>;

release语句执行后,原先由force语句对变量或者线网施加的过程连续赋值将失效,变量将解除被被连续赋值的状态,较低优先级的赋值语句的赋值操作将有效。

③示例:

s0:实现对变量var_reg1的过程赋值操作,即var_reg1被赋值为3'b000;

s1:执行assign过程连续赋值语句,用来实现对变量var_reg2的连续赋值,从而var_reg2将被连续赋值为3'b001;

s2:在执行本条语句时,var_reg1未被assign语句进行过连续赋值操作,因此var_reg1被force连续赋值为3'b100;

s3:执行本条语句后,var_reg2被force连续赋值为3'b100;

s4:执行本条语句时,因为变量var_reg1将退出连续赋值的状态,因为var_reg1未曾被assign语句进行过连续赋值操作,故var_reg1取值保持不变,即保持force状态时的值3'b100;

s5:执行本语句时,因为var_reg2在执行s3之前已经由s1实现了连续赋值,所以在本条语句s5执行后,变量var_reg2将恢复到由assign语句s1确定的连续赋值状态,即3'b001;

4. 赋值语句的区别

4.1 连续赋值语句和过程赋值语句之间的区别

• 连续赋值语句由assign来标示,而过程赋值语句不能包含这个关键词;
• 连续赋值语句中左侧的数据类型必须是线网数据类型,而过程赋值语句中的被赋值数据类型则必须是寄存器类型的变量;
• 连续赋值语句不能出现在过程块(initial或always)中,而过程赋值语句可以;
• 连续赋值语句主要用来对组合逻辑电路进行建模以及对线网数据间的连接进行描述,而过程赋值语句主要用来对时序逻辑电路进行行为描述;
• 连续赋值语句对被赋值线网型数据的赋值是“连续”的(即赋值表达式的任何变化都会在立刻反应在线网数据的取值上),而过程性赋值语句,只有在过程赋值语句被执行时才执行赋值操作,语句执行完后被赋值变量的取值不再受到赋值表达式的影响(注意这里的一次是指:在initial块中,过程性赋值只顺序执行一次,而在always块中,每一次满足always的条件时,都要顺序执行一次该always块中的语句。)。
• 连续赋值与过程赋值的区别:

4.2 过程连续赋值语句和连续赋值语句之间的区别

• 过程连续赋值语句只能用在过程块(initial过程快或always过程块)内,而连续赋值语句不能出现在过程块中。
• 过程连续赋值语句可以对寄存器类型变量进行连续赋值(其中force-release语句还可以对线网进行连续赋值),但是其赋值目标不能是变量或线网的某一位或某几位,而连续赋值语句只能对线网数据进行赋值,赋值目标可以是线网型数据的某一位或某几位。

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

    关注

    39

    文章

    7715

    浏览量

    170854
  • Verilog
    +关注

    关注

    30

    文章

    1370

    浏览量

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

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    NucleiStudio如何生成.verilog文件和.dasm文件,以及对.dasm文件自定义指令反汇编结果分析

    文件,以及对.dasm文件自定义指令反汇编结果分析。 一、如何生成.verilog和.dasm文件文件 项目右键选择Properties 选择C/C++ Build下面的Setting 更改
    发表于 10-24 06:33

    Unicore标准NEMA语句GSA及说明

    本文介绍和芯星通的NEMA语句说明。
    的头像 发表于 07-16 11:39 485次阅读
    Unicore标准NEMA<b class='flag-5'>语句</b>GSA及说明

    matlab appdesigner 表格组件赋值问题,求助

    如上图所示,我在用matlab2021Ra APP模块进行编程的时候,想在表格调入自己编写的结构数组,我从网上AI了一个程序语句,看着没问题,但是就是给表格赋值不了,还请各位大神帮忙看一下这个是怎么回事,我是初学者,请各位帮
    发表于 07-12 11:45

    基础篇3:掌握Python的条件语句与循环

    在Python编程语言中,条件语句和循环是构成复杂逻辑和数据处理的基石。本篇基础教程将帮助您深入了解Python的条件语句和循环结构,让您能够更好地控制程序流程。 条件语句 条件
    发表于 07-03 16:13

    详解TIA Portal SCL编程语言中的IF语句

    IF 语句是编程中最基本和最重要的控制结构之一,它的主要作用是根据条件决定程序的执行路径,IF 语句是编程实现逻辑判断和决策的基础。
    的头像 发表于 05-24 15:01 1441次阅读
    详解TIA Portal SCL编程语言中的IF<b class='flag-5'>语句</b>

    verilog模块的调用、任务和函数

    在做模块划分时,通常会出现这种情形,某个大的模块包含了一个或多个功能子模块,verilog是通过模块调用或称为模块实例化的方式来实现这些子模块与高层模块的连接的.
    的头像 发表于 05-03 10:29 1286次阅读
    <b class='flag-5'>verilog</b>模块的调用、任务和函数

    在testbench如何使用阻塞赋值和非阻塞赋值

    本文详细阐述了在一个testbench,应该如何使用阻塞赋值与非阻塞赋值。首先说结论,建议在testbench,对时钟信号(包括分频时钟)使用阻塞
    的头像 发表于 04-15 09:34 1007次阅读
    在testbench<b class='flag-5'>中</b>如何使用阻塞<b class='flag-5'>赋值</b>和非阻塞<b class='flag-5'>赋值</b>

    FPGA Verilog HDL语法之编译预处理

    语句)。Verilog HDL编译系统通常先对这些特殊的命令进行“预处理”,然后将预处理的结果和源程序一起在进行通常的编译处理。
    的头像 发表于 03-27 13:30 1088次阅读
    FPGA <b class='flag-5'>Verilog</b> HDL语法之编译预处理

    Verilogsigned和$signed()的用法

    吗?其实不是的,因为有符号数和无符号数据的加法强结果和乘法器结构是一样的,signed的真正作用是决定如何对操作数扩位的问题。 2、verilog的加法和乘法操作前,会先对操作数据扩位成结果相同的位宽,然后进行加法或者乘法处理。比如a/b都为4位数据,c为5位数据,c
    的头像 发表于 02-17 17:47 1185次阅读
    <b class='flag-5'>Verilog</b><b class='flag-5'>中</b>signed和$signed()的用法

    浅谈Verilog和VHDL的区别

    Verilog和VHDL是两种广泛使用的硬件描述语言(HDL),它们用于描述和模拟数字电路系统的行为和结构。这两种语言的主要作用是帮助工程师设计、仿真和验证集成电路(IC)和系统级芯片(SoC)的硬件模块。
    的头像 发表于 02-17 14:20 2630次阅读
    浅谈<b class='flag-5'>Verilog</b>和VHDL的<b class='flag-5'>区别</b>

    使用TLV5625在主函数里面的FOR循环中对两通道赋值,一个通道不能更新数据是怎么回事?

    问题:我在使用TLV5625时出现如下问题,在主函数里面的FOR循环中对两通道赋值,2通道DA可以正常更新输出,但是同样的语句放到定时器中断,只有一个通道正常,另一个通道不能更新数据,请指教
    发表于 01-08 08:23

    Verilog 电路仿真常见问题 Verilog 在芯片设计的应用

    。然而,在实际应用,设计师可能会遇到各种问题,这些问题可能会影响仿真的准确性和设计的可靠性。 Verilog电路仿真常见问题 仿真环境的搭建问题 仿真环境的搭建是进行Verilog仿真的第一步。设计师需要选择合适的仿真工具,并
    的头像 发表于 12-17 09:53 1602次阅读

    Verilog 与 ASIC 设计的关系 Verilog 代码优化技巧

    Verilog与ASIC设计的关系 Verilog作为一种硬件描述语言(HDL),在ASIC设计扮演着至关重要的角色。ASIC(Application Specific Integrated
    的头像 发表于 12-17 09:52 1439次阅读

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

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

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

    Verilog 与 VHDL 比较 1. 语法和风格 VerilogVerilog 的语法更接近于 C 语言,对于有 C 语言背景的工程师来说,学习曲线较平缓。它支持结构化编程,代码更直观,易于
    的头像 发表于 12-17 09:44 2691次阅读