关于Verilog中的几种赋值语句(assign/deassign/force/release)

您所在的位置:网站首页 verilog符号流 关于Verilog中的几种赋值语句(assign/deassign/force/release)

关于Verilog中的几种赋值语句(assign/deassign/force/release)

2023-07-22 23:17| 来源: 网络整理| 查看: 265

摘自关于Verilog中的几种赋值语句

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

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

连续复制的主要特点是:

连续赋值语句的左值可以是一下类型之一:

①标量线网

②向量线网

③矩阵中的一个元素(该矩阵可以是标量线网类型的,也可以是向量线网类型的)

④向量线网的某一位

⑤向量线网的部分位

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

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

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

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

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

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

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

④上面三种类型的拼接

    过程性赋值语句包括两种类型的赋值语句:阻塞赋值(=)和非阻塞赋值(;

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块中的语句。)。连续赋值与过程赋值的区别:

 

 过程赋值

 连续赋值

 assign

 无assign(过程性连续赋值除外)

 有assign

 符号

  使用“=”或“《=” 

  只使用“=”

 位置

  在always语句或initial语句中均可出现

 不可出现于always语句和initial语句

执行条件

 与周围其他语句有关

 等号右端操作数的值发生变化时

 用途

 驱动寄存器

 驱动线网

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

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

 



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3