阻塞赋值和非租塞赋值

关键词:inital,always

它们是行为级建模的 2 种基本语句。

一个模块中可以包含多个 initial 和 always 语句,但 2 种语句不能嵌套使用。

这些语句在模块间并行执行,与其在模块的前后顺序没有关系。

但是 initial 语句或 always 语句内部可以理解为是顺序执行的(非阻塞赋值除外)。

其中针对每个 initial 语句或 always 语句都会产生一个单独的运行的流程,执行时间都是从 0 时刻开始。

initial 语句从 0 时刻开始执行,只执行一次,多个 initial 块之间是相互独立的。

如果 initial 块内包含多个语句,需要使用关键字 begin 和 end 组成一个块语句。

如果 initial 块内只要一条语句,关键字 begin 和 end 可使用也可不使用。

就上面这几条就已经说明了大部分的initial的用法就。

但是always就不一样了,他是重复执行的,always语句也是从零时刻开始,但是执行到最后一句后就一直循环。

在讲解完always的用法后,就开始学习阻塞语句

过程性赋值是在 initial 或 always 语句块里的赋值,赋值对象是寄存器、整数、实数等类型。

这些变量在被赋值后,其值将保持不变,直到重新被赋予新值。

连续性赋值总是处于激活状态,任何操作数的改变都会影响表达式的结果;过程赋值只有在语句执行的时候,才会起作用。这是连续性赋值与过程性赋值的区别。

Verilog 过程赋值包括 2 种语句:阻塞赋值与非阻塞赋值。

阻塞赋值

阻塞赋值属于顺序执行,即下一条语句执行前,当前语句一定会执行完毕。

阻塞赋值语句使用等号 = 作为赋值符。

前面的仿真中,initial 里面的赋值语句都是用的阻塞赋值。

非阻塞赋值

非阻塞赋值属于并行执行语句,即下一条语句的执行和当前语句的执行是同时进行的,它不会阻塞位于同一个语句块中后面语句的执行。

非阻塞赋值语句使用小于等于号 <= 作为赋值符。

使用非阻塞赋值语句避免竞争冒险 (在一组时序逻辑过程中,混合使用阻塞语句和非组赛语句时,会导致时序控制不稳定,控制难度大。) 在always时序逻辑块中多使用非阻塞语句,always组合逻辑块中多用组合阻塞语句,initial语句中多用阻塞语句。 在always的使用过程中,会经历竞争的情况,比如寄存器数值交换的,a寄存器和b寄存器的交换,在c语言中,基本是需要接住tmp寄存器才能做到寄存器交换,但是由于FPGA独立线程的设计结构,可以使用赋值操作<=操作,???(没懂这个关系语句怎么做到数值交换。)(这就是非阻塞语句赋值,完全不影响后面语句的执行,)

时序控制

Verilog提供了俩大类的时序控制方法,时延控制和事件控制 时延控制:基于时延的时序控制出现在表达式中,它指定了语句从开始执行到执行完毕之间的时间间隔。(也就是我们常说的时间间隔,时间延时时间) 常规时延:有两种表达方式,第一种写在操作语句前,表示这个操作的结果要等待#多少个时延,才能执行,第二种直接讲#时间作为一个单独的操作,也是我很喜欢的一种写的方式。 内嵌时延,就是时延语句是在控制语句内部,如a= #10 b+c; 这就是先计算结果然后保存结果等待一定时间在赋值,但是两种时延的控制效果是不一样的,???(这里有个例子,在使用内嵌式的时候会比常规方式完晚一个阶段,晚的时间是因为测试时间在第25ns的时候才会变为1,但是内嵌时延是在第10时计算,这个时候测试的还没有剖变化,所以,在10ns时,内嵌的部分并没有改变,直到55ns时,接受到这个时刻测试的高电平,在进行计算,所以从仿真图来看,就是内嵌的部分,玩了30ns反应。) 边沿触发事件控制 在Verilog中,事件是指某一个reg或者wire型变量发生了值的变化,一般分为这几个种类型 一般事件控制:事件控制符号@表示,语句执行的条件是信号的值发送特定的变化。关键字posedge指信号发生边沿正向跳变,negedge指信号发生负向边沿跳变,未指名跳变方向时,则两种情况的边沿变化都会触发相关事件。(我感觉就好像是条件语句,从JAVA层面说就是增加了一个注释,根据不同的注释内容进行触发不同的结果) 例子:always@(clk)q<=d;//信号clk只要发生变化,就执行q<=d, 还有一种特殊写法 q=@(poseedg clk)q<=d; 命名事件控制,用户可以声明event类型的变量,并触发改变量来识别事件是否发生。命名时间用关键字event来声明,触发信号用->来表示。(这就是类似函数的表达方式,在使用之前,先定义函数,我并没有看到可以先写函数,都是模块式写法。) 敏感列表 在一组数据或者条件中,满足其中一个,都算作是满足条件,这些条件叫做敏感列表,当然也可以用or或者,来链接。 在实际运用中,可能条件非常多,所以可以使用@*来表示缩写,意义是下列语句块的所以输入变量都是敏感的。 电平敏感事件控制:Verilog还支持电平作为敏感信号来控制时序,既后面语句执行需要等待前面的某个条件为真。(我真没觉的这个更一般说明有什么区别,在看介绍的时候,我还以为是控制电平速率,改变电平信号的那种) Verilog语句块 (这就是一些语法块的书写规则) 顺序块 顺序块用关键字begin和end来表示,顺序块的语句是一句句的执行,每条语句都需要遵循前面的时延, 并行块,有关键字fork和join来表示,顾名思义,所有的语句都是并行的,其中包括所有阻塞语句,非阻塞语句。

嵌套块

顺序块和并行块组合使用,比如在顺序块中加入并行块,这样就能实现一对多的线程使用。

命名块

给语句块进行命名,被命名的快(类似类,内部类)可以声明局部变量,通过层次名引用的方法对变量进行访问。

(在命名快的执行过程中,disable可以终止,但是这和break不一样,这个如果放在末尾,所以的快都要停止。)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值