一、verilog中的阻塞语句和非阻塞语句什么区别
赋值的类型的选择取决于建模的逻辑类型
在时序块的 RTL代码中使用非阻塞赋值。
非阻塞赋值在块结束后才完成赋值操作,此赋值方式可以避免在仿真出现冒险和竞争现象。
在组合的 RTL代码中使用阻塞赋值。
使用阻塞方式对一个变量进行赋值时,此变量的值在在赋值语句执行完后就立即改变。
使用非阻塞赋值方式进行赋值时,各个赋值语句同步执行;因此,通常在一个时钟沿对临时变量进行赋值,而在另一个时钟沿对其进行采样。
下面的模块综合为触发器,
其中采用了阻塞赋值方式:
module bloc(clk,a,b);
input clk, a;
output b; reg b;
reg y;
always@(posedge clk)
begin
y=a;
b=y;
end
endmodule
下面的模块综合为两个触发器
,其中采用了非阻塞赋值方式:
module nonbloc(clk,a,b);
input clk, a;
output b; reg b;
reg y;
always@(posedge clk)
begin
y<=a;
b<=y;
end
endmodule
上面的两个例子的综合的结果不同,左边的例子使用了阻塞赋值方式,综合器将其综合为一个触发器。右边的例子使用了非阻塞赋值方式,综合器将其综合为两个触发器,y将出现在综合列表中,作为第二个触发器的输入。
非阻塞过程赋值
module swap_vals;
reg a, b, clk;
initial begin过程赋值有两类
a= 0; b= 1; clk= 0;
阻塞过程赋值
end
always#5 clk=~clk;非阻塞过程赋值
always@( posedge clk)
begin
a<= b;//非阻塞过程赋值
b<= a;//交换a和b值
end
endmodule
阻塞过程赋值执行完成后再执行在顺序块内下一条语句。
非阻塞赋值不阻塞过程流,仿真器读入一条赋值语句并对它进行调度之后,
就可以处理下一条赋值语句。
若过程块中的所有赋值都是非阻塞的,赋值按两步进行:
1.仿真器计算所有RHS表达式的值,保存结果,并进行调度在时序控制指
定时间的赋值。
2.在经过相应的延迟后,仿真器通过将保存的值赋给LHS表达式完成赋
值。
非阻塞过程赋值(续)
阻塞与非阻塞赋值语句行为差别举例1
module non_block1;输出结果:
reg a, b, c, d, e, f;
initial begin// blocking assignments 0 a= x b= x c= x d= x e= x f= x
a=#10 1;// time 10
2 a= x b= x c= x d= x e= 0 f= x
b=#2 0;// time 12
c=#4 1;// time 16 4 a= x b= x c= x d= x e= 0 f= 1
end
initial begin// non- blocking assignments 10 a= 1 b= x c= x d= 1 e= 0 f= 1
d<=#10 1;// time 10
12 a= 1 b= 0 c= x d= 1 e= 0 f= 1
e<=#2 0;// time 2
f<=#4 1;// time 4 16 a= 1 b= 0 c= 1 d= 1 e= 0 f= 1
end
initial begin
$monitor($ time,," a=%b b=%b c=%b d=%b e=%b f=%b", a, b, c, d, e, f);
#100$finish;
end
endmodule
非阻塞过程赋值(续)
阻塞与非阻塞赋值语句行为差别举例2
module pipeMult(product, mPlier, mCand, go, clock);
input go, clock;
input [7:0] mPlier, mCand;
output [15:0] product;
reg [15:0] product;
always@(posedge go)
product= repeat(4)@(posedge clock) mPlier* mCand;
endmodule
module pipeMult(product, mPlier, mCand, go, clock);
input go, clock;
input [7:0] mPlier, mCand;
output [15:0] product;
reg [15:0] product;
always@(posedge go)
product<= repeat(4)@(posedge clock) mPlier* mCand;
endmodule
二、在Verilog中,字符串 “ab ”等价于16’h5758应该怎么理解
风雷哥说的对,verilog里面根本就没有啥ASCII码,更没有什么字符串,只有01,也只有01才是电路的本质,世界的本质。。。ab就是机器码 10101011,根本和16‘h5758没啥关系,16’h5758换算成机器码就是 0101011101011000如果非要让两者相等,就只能是你定义了一个名位 ab的参数,宽度为16位,用以下语句赋值了 parameter ab= 16‘h5758;这样就有你所谓的字符串等于16’h5758了。
三、关于verilog 的assign
关于问题补充:其实如果想做赋值的话,一般都会习惯性地定义一下reg型变量,然后在always语句块内直接赋值就可以了,类似于:reg a;a=1。很少有人定义wire型变量然后再赋值的,wire型一般都是在上层模块中调用下层模块的输入输出时才会定义的类型,一般都是这样。而assign命令一般都习惯性地当做连线用,比如想把一个模块的输出给另一个模块当输入,就可以assign Input=Output;
至于时钟那两句,其实那个也是习惯性的写法,一般都习惯使用时钟信号同步整个模块,而时钟信号就是从testbench文件中发出的。特别是对于大的工程,这样的设定会方便各个模块之间的同步。我可不是什么工程师,只不过是刚学了verilog一年的研究生而已,呵呵
初学者吧?你写的这个有太多不规范的地方==
虽然assign可以这样用,不过很少有人这么写。assign相当于连线,一般它的用处是将一个变量的值不间断地赋值给另外一个,就像把这两个变量连在一起一样。
替你写了个testbench,应该还算是比较规范的,你可以参考我的改一下。如果还不行的话你把你的源代码给我我可以帮你看一下
`timescale 1ns/ 1ps
////////////////////////////////////////////////////////////////////////////////
// Company:
// Engineer:
//
// Create Date: 11:03:54 07/01/2010
// Design Name: tb_bin27seg
// Module Name: D:/Xilinx/11.1/myproject/test12/testbench.v
// Project Name: test12
// Target Device:
// Tool versions:
// Description:
//
// Verilog Test Fixture created by ISE for module: tb_bin27seg
//
// Dependencies:
//
// Revision:
// Revision 0.01- File Created
// Additional Comments:
//
////////////////////////////////////////////////////////////////////////////////
`timescale 1ns/ 1ps
////////////////////////////////////////////////////////////////////////////////
// Company:
// Engineer:搞吓米飞机
//
// Create Date: 17:14:55 05/08/2010
// Design Name: test
// Module Name: D:/Xilinx/11.1/myproject/convolution/convolutiontest.v
// Project Name: convolution
// Target Device:
// Tool versions:
// Description:
//
// Verilog Test Fixture created by ISE for module: convolution
//
// Dependencies:
//
// Revision:
// Revision 0.01- File Created
// Additional Comments:
//
////////////////////////////////////////////////////////////////////////////////
module test;
// Inputs
reg clk;
reg din;
reg en;
// Outputs
wire dout;
// Instantiate the Unit Under Test(UUT)
bin27seg tb(
.din(din),
.en(en),
.dout(dout));
initial begin
// Initialize Inputs
clk=0;
din=0;
en=1;
// Wait 100 ns for global reset to finish
#100;
en=0;
// Add stimulus here
end
always#4 Clk=~Clk;
always@(posedge clk)
begin
if(din<=4'b1111)
begin
din=din+1;
end
else
begin
din=0;
end
end
endmodule
非常感谢您的阅读!我们希望本文对于解决您关于7.Verilog中的assign语句和关于verilog 的assign的问题提供了一些有价值的信息。如果您还有其他疑问,我们将很乐意为您提供进一步的帮助。