Verilog中阻塞赋值和非阻塞赋值 求助

Verilog中阻塞赋值和非阻塞赋值 求助,第1张

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

always@(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

always@(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_blockingu1(clk, a, b2, c2)

blocking u2(clk,a, b1, c1)

endmodule

module mux2_1(out,a,b,sel)

input a,b,sel

output out

reg out

always@(a or b or sel)

begin

if(sel==0) out=a //阻塞态橘赋值

else out=b //阻塞赋值

end

endmodule

//下面是一个简羡闭穗单的测试平台,可以根据不同兄卜的要求编写

module t_mux2_1

reg a,b,sel

wire out

initial

begin

a=0

b=1

sel=0

#100

sel=0

end

mux2_1 u1(.a(a),.b(b),.sel(sel),.out(out))

endmodule

(1)在描述组合逻辑的always块中用阻塞赋值,则综合成胡粗组合逻辑的电路结构

(2)在描述时序逻辑的友做凳always块中用非阻塞赋值,则综合成时序逻辑的电路结构

要使综合前仿真和综合后仿真一致就一定要这么做。

实际应用上,我比较喜欢用非阻塞赋值。如果用了非好旅阻塞赋值,很多竞争冒险,那就用异步复位法


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/yw/8241724.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-14
下一篇2023-04-14

发表评论

登录后才能评论

评论列表(0条)

    保存