Verilog堵塞赋值与非堵塞赋值

verilog设计进阶

时间:2014年5月6日星期二

主要收获:

1.堵塞赋值与非堵塞赋值;

2.代码測试;

3.组合逻辑电路和时序逻辑电路。

堵塞赋值与非堵塞赋值:

1.堵塞赋值“=”(组合逻辑电路)。非堵塞赋值“<=”(时序逻辑电路);

2.Verilog模块编程的8个原则:

(1)  时序电路建模时,用非堵塞赋值。

(2)  锁存器电路建模时,用非堵塞赋值。

(3)  用always块建立组合逻辑模型时。用堵塞赋值。

(4)  在同一个always块中建立时序和组合逻辑电路时,用非堵塞赋值。

(5)  在同一个always块中不要既用非堵塞赋值又用堵塞赋值。

(6)  不要在一个以上的always块中为同一个变量赋值。

(7)  用$strobe系统任务来显示用非堵塞赋值的变量值。

(8)  在赋值时不要使用#0延时。

在编写时牢记这八个要点能够为绝大多数的Verilog用户解决在综合后仿真中出现的90-100% 的冒险竞争问题。

3.所谓堵塞的概念是指在同一个always块中。其后面的赋值语句从概念上是在前一条赋值语句结束后開始赋值的。

4.非堵塞语句的运行过程是:首先计算语句块内部全部右边表达式(RHS)的值,然后完毕对左边寄存器变量的赋值操作。

5.在代码上的差别:

begin

B=A;

C=B+1;

end

上述代码先将A的值赋值给B。C的值是A+1。

begin

B<=A;

C<=B+1;

end

上述代码的终于结果是:将A赋值给了B,可是C的值是B原来的值+1。由于最先计是的是右边的表达式。

组合逻辑电路与时序逻辑电路:

1.数字电路依据逻辑功能的不同特点,能够分成两大类。一类叫组合逻辑电路(简称组合电路),还有一类叫做时序逻辑电路(简称时序电路)。

2.组合逻辑电路在逻辑功能上的特点是随意时刻的输出只取决于该时刻的输入。与电路原来的状态无关。

3.时序逻辑电路在逻辑功能上的特点是随意时刻的输出不仅取决于当时的输入信号,并且还取决于电路原来的状态,或者说,还与曾经的输入有关。

 

Verilog代码:

moduleblocking(clk, a, b, c);

output [3:0] b,c;

input [3:0] a;

input clk;

reg   [3:0] b,c;

[email protected](posedge clk) begin

b = a;

c = b;

$display("Blocking: a = %d, b= %d, c = %d.", a, b, c);

end

endmodule

相应原理图:

modulenon_blocking(clk, a, b, c);

output [3:0] b,c;

input [3:0] a;

input clk;

reg   [3:0] b,c;

[email protected](posedge clk) begin

b <= a;

c <= b;

$display("Non_Blocking: a =%d, b = %d, c = %d.", a, b, c);

end

endmodule

相应原理图:

測试代码:

`timescale1ns/1ns

moduleblocking_test;

wire [3:0] b1, c1, b2, c2;

reg [3:0] a;

reg clk;

initial begin

clk = 0;

forever #50 clk = ~clk;

end

initial begin

a = 4‘h3;

$display("______________________");

#100 a = 4‘h7;

$display("______________________");

#100 a = 4‘hf;

$display("______________________");

#100 a = 4‘ha;

$display("______________________");

#100 a = 4‘h2;

$display("______________________");

#100$display("______________________");

$stop;

end

non_blocking        u1(clk, a, b2, c2);

blocking               u2(clk,a, b1, c1);

endmodule

仿真波形图:

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdTAxMjM3MzAyMA==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" >

时间: 2024-08-03 10:31:45

Verilog堵塞赋值与非堵塞赋值的相关文章

Verilog阻塞赋值与非阻塞赋值

今天又个兄弟求助,数据库里一个表有数据如下: no  name 1    a 2    b 3    c 4    d 如何用一个sql显示如下结果: ab ac ad bc bd cd 对于这种构造数据,是分析函数的强项,下面来做个试验: create table t (no number,name varchar(2)); insert into t values(1,'a'); insert into t values(2,'b'); insert into t values(3,'c')

关于verilog阻塞赋值与非阻塞赋值的一些浅见

最近学到了关于verilog的阻塞赋值与非阻塞赋值的一些区别,经过网上查阅与仿真实验,有了一些理解.希望能够记下来. 说到verilog的阻塞与非阻塞赋值,不得不说的就是verilog的事件表,如下: 阻塞赋值,属于活跃事件,计算完RHS(Right Hand Side)立即更新左值.期间同一块内其他语句不能执行,即阻塞其他语句执行. 而非阻塞右值计算属于活跃事件,非阻塞左值更新属于非活跃事件,即计算完RHS,不能立即更新左值,而要等所有活跃事件完成,才能完成左值更新,出事件队列.   然后说说

阻塞赋值与非阻塞赋值

     过程赋值:用于对reg型变量赋值,改变寄存器的值或为以后排定改变.      语法 {阻塞性(blocking)赋值} RegisterLValue = [ TimingControl] Expression; {非阻塞性(non-blocking)赋值} RegisterLValue <= [ TimingControl] Expression; 阻塞:在本语句中"右式计算"和"左式更新"完全完成之后,才开始执行下一条语句: 非阻塞:当前语句的执行

阻塞赋值与非阻塞赋值(转载)

 前言:阻塞与非阻塞赋值是Verilog语言中最基本的部分,也是让大部分Verilog新手最困惑的地方.关于阻塞与非阻塞的著作文章可谓汗牛充栋,这些文章对阻塞与非阻塞赋值的原理进行了非常详细的讲解,但新手读了之后依然有种似懂非懂的感觉,编码过程中一如既往的犯错.所以,本文的目的立足于提供一种实用化的解决方案,用最简单的语言和形象的类比让新手能够一目了然的明白正确的编码方式以及相应的电路行为逻辑,关于仿真细节的讲解不是本文重点,需要了解更多细节的朋友可以参考文后列举的参考文献. 本文共分为三部分,

07-阻塞赋值与非阻塞赋值原理分析——小梅哥FPGA设计思想与验证方法视频教程配套文档

芯航线--普利斯队长精心奉献 ? 实验目的:掌握阻塞赋值与非阻塞赋值的区别 实验平台:无 实验原理: ????阻塞赋值,操作符为"=","阻塞"是指在进程语句(initial和always)中,当前的赋值语句阻断了其后的语句,也就是说后面的语句必须等到当前的赋值语句执行完毕才能执行.而且阻塞赋值可以看成是一步完成的,即:计算等号右边的值并同时赋给左边变量. ????非阻塞赋值,操作符为"<=","非阻塞"是指在进程语句(

FPGA之阻塞赋值与非阻塞赋值

Verilog语言中讲的阻塞赋值与非阻塞赋值,但从字面意思来看,阻塞就是执行的时候在某个地方卡住了,等这个操作执行完在继续执行下面的语句,而非阻塞就是不管执行完没有,我不管执行的结果是什么,反正我继续下面的事情.而Verilog中的阻塞赋值与非阻塞赋值正好也是这个意思,通过执行一个例子,就可以简单地明白了:1.阻塞赋值可以理解为语句的顺序执行,因此语句的执行顺序很重要2.非阻塞赋值可以理解为语句的并行执行,所以语句的执行不考虑顺序3.在assign的结构中,必须使用的是阻塞赋值 //阻塞modu

阻塞赋值和非阻塞赋值

2017-12-01 在Verilog语言中,赋值语句经常使用,阻塞赋值和非阻塞赋值经常带给我们很多困扰.在此讨论两种赋值方式的差异性. 首先根据表面含义深刻理解阻塞和非阻塞: 阻塞:在进程语句块中(initial或者always或者其他),当前赋值语句的执行阻塞了后面语句的执行.即后面语句的赋值需要等到当前赋值过程完成才能得以执行,即可认为执行过程是顺序执行的(我们要明白Verilog中,大多数情况模块都是并发执行的). 非阻塞:当前赋值语句的执行不会阻塞后续语句的执行,即可以认为当前赋值语句

用一个例子来学习阻塞赋值和非阻塞赋值

阻塞赋值与非阻塞赋值 阻塞赋值的一般表达式为:目标变量名=驱动表达式  阻塞赋值是一种理想化的数据传输,赋值立即发生,不存在延时行为 非阻塞赋值一般表达式为:目标变量名<=驱动表达式   非阻塞赋值比较接近真实的电路工作状态,应为他从综合的角度考虑到了延时和并行性. 在过程启动中,非阻塞赋值使三条语句同时运行,而阻塞赋值是按顺序方式完成更新的数据的. 新建工程,编写示例代码 module block_nonblock(clk,rst_n,a,b,c,out ); input clk,rst_n,

verilog 阻塞赋值和非阻塞赋值

1 module main(); 2 reg clk=0; 3 reg [11:0] a=0; 4 reg [11:0] b=0; 5 always #50 clk=~clk; 6 always@(clk) 7 begin 8 a=a+4; 9 b<=a/4; 10 end 11 endmodule 如果把always中的两句顺序倒一下输出结果会改变是为什么? 上面的程序0~50s时,b=1:改成下面情形后b=0; 1 module main(); 2 reg clk=0; 3 reg [11: