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代码:

module 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("Blocking:
a = %d, b = %d, c = %d.", a, b, c);

end

endmodule

对应原理图:

module non_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

对应原理图:

测试代码:

`timescale 1ns/1ns

module blocking_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

仿真波形图:

时间: 2024-12-16 08:27:49

Verilog之阻塞赋值非阻塞赋值的相关文章

Verilog -- 阻塞与非阻塞的仿真与综合

Verilog -- 阻塞与非阻塞的仿真与综合 目录 Verilog -- 阻塞与非阻塞的仿真与综合 基本概念 Verilog层积事件列(stratified event queue) 示例:自触发的always块 阻塞和非阻塞的综合问题 非阻塞赋值和$display 0延时 建议 参考 Clifford E. Cummings, Sunburst Design, Inc. "Nonblocking Assignments in Verilog Synthesis, CodingStyles T

verilog中阻塞与非阻塞

越是看似简单.经常接触的.我们越是不知其所以然.这就是我写本文的原因.阻塞和非阻塞赋值一般使用在进程中,包括always和initial进程.assign赋值等操作中. 阻塞赋值与非阻塞赋值 always @(event-expression) begin     <LHS1=RHS1> <LHS2=RHS2> ...... end 同样可将采用非阻塞赋值方式的always进程块写成下面的形式: always @(event-expression) begin     <LH

Linux设备驱动中的阻塞和非阻塞I/O

[基本概念] 1.阻塞 阻塞操作是指在执行设备操作时,托不能获得资源,则挂起进程直到满足操作所需的条件后再进行操作.被挂起的进程进入休眠状态(不占用cpu资源),从调度器的运行队列转移到等待队列,直到条件满足. 2.非阻塞 非阻塞操作是指在进行设备操作是,若操作条件不满足并不会挂起,而是直接返回或重新查询(一直占用CPU资源)直到操作条件满足为止. 当用户空间的应用程序调用read(),write()等方法时,若设备的资源不能被获取,而用户又希望以阻塞的方式来访问设备,驱动程序应当在设备驱动层的

Linux设备驱动中的IO模型---阻塞和非阻塞IO【转】

在前面学习网络编程时,曾经学过I/O模型 Linux 系统应用编程——网络编程(I/O模型),下面学习一下I/O模型在设备驱动中的应用. 回顾一下在Unix/Linux下共有五种I/O模型,分别是: a -- 阻塞I/Ob -- 非阻塞I/Oc -- I/O复用(select和poll)d -- 信号驱动I/O(SIGIO)e -- 异步I/O(Posix.1的aio_系列函数) 下面我们先学习阻塞I/O.非阻塞I/O .I/O复用(select和poll),先学习一下基础概念 a -- 阻塞 

同步与异步、阻塞与非阻塞

"阻塞"与"非阻塞"与"同步"与"异步"不能简单的从字面理解,提供一个从分布式系统角度的回答.1.同步与异步同步和异步关注的是消息通信机制 (synchronous communication/ asynchronous communication)所谓同步,就是在发出一个*调用*时,在没有得到结果之前,该*调用*就不返回.但是一旦调用返回,就得到返回值了.换句话说,就是由*调用者*主动等待这个*调用*的结果. 而异步则是相反

阻塞、非阻塞、同步、异步

同步和异步关注的是消息通信机制. 同步 调用者主动等待调用结果返回,没有得到结果之前,该调用不返回. 异步 调用者不必马上等待返回结果,执行部件通过通知.状态或回调函数来返回结果给调用者. 阻塞和非阻塞关注的是程序等待调用结果的状态. 阻塞 调用返回之前,当前线程挂起.调用线程只有等待结果之后才返回. 非阻塞 它不会阻塞当前线程.

同步与异步,阻塞与非阻塞基础

1.同步与异步 同步和异步关注的是消息通信机制 (synchronous communication/ asynchronous communication) 同步,在发出一个调用时,在没有得到结果之前,该调用就不返回.但是一旦调用返回,就得到返回值了.是由调用者主动等待这个调用的结果. 异步,调用在发出之后,这个调用就直接返回了,所以没有返回结果.当一个异步过程调用发出后,调用者不会立刻得到结果.而是在调用发出后,被调用者通过状态.通知来通知调用者,或通过回调函数处理这个调用. 2.阻塞与非阻

socket阻塞与非阻塞,同步与异步、I/O模型,select与poll、epoll比较

1. 概念理解 在进行网络编程时,我们常常见到同步(Sync)/异步(Async),阻塞(Block)/非阻塞(Unblock)四种调用方式: 同步/异步主要针对C端: 同步:      所谓同步,就是在c端发出一个功能调用时,在没有得到结果之前,该调用就不返回.也就是必须一件一件事做,等前一件做完了才能做下一件事. 例如普通B/S模式(同步):提交请求->等待服务器处理->处理完毕返回 这个期间客户端浏览器不能干任何事 异步:      异步的概念和同步相对.当c端一个异步过程调用发出后,调

IO-同步,异步,阻塞,非阻塞

IO-同步,异步,阻塞,非阻塞1.什么是IO数据在系统内核(kernel)和用户进程之间的传递,称为IO. 2.IO操作步骤以read为例,涉及两个系统对象,调用IO的process(or thread),即用户进程:另一个为系统内核(kernel).当用户进程调用recvfrom操作时,会经历两个阶段1)等待数据准备2)将数据从内核拷贝至进程中 3.IO模型根据用户进程在IO操作时的状态,可以分为5中IO类型:blocking IO:阻塞IOnon-blocking IO:非阻塞IOIO mu

阻塞IO,非阻塞IO,异步IO和非异步IO 的区别

最近在研究java IO.NIO.NIO2(或者称AIO)相关的东西,有些概念还是要明确下. 按照<Unix网络编程>的划分,IO模型可以分为:阻塞IO.非阻塞IO.IO复用.信号驱动IO和异步IO,按照POSIX标准来划分只分为两类:同步IO和异步IO. 如何区分呢?首先一个IO操作其实分成了两个步骤: 1.发起IO请求 2.实际的IO操作 阻塞和非阻塞IO:在于第一个步骤是否会会被阻塞,如果会则是阻塞IO,否则是非阻塞IO. 异步和非异步(同步)IO:在于第二个步骤是否会阻塞,如果实际的I