首页 > 代码库 > Verilog堵塞赋值与非堵塞赋值
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;
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_blocking u1(clk, a, b2, c2);
blocking u2(clk,a, b1, c1);
endmodule
仿真波形图:
Verilog堵塞赋值与非堵塞赋值