Verilog 过程赋值

阻塞赋值

用=赋值,顺序执行

非阻塞赋值

并行执行,用<=作为赋值符号

`timescale 1ns/1ns

module test;
	reg[3:0] ai,bi;
	reg[3:0] ai2,bi2;
	reg[3:0] value_blk;
	reg[3:0] value_non;
	reg[3:0] value_non2;
	
	initial begin
		ai = 4'd1;
		bi = 4'd2;
		ai2 = 4'd7;
		bi2 = 4'd8;
		
		ai = 4'd3;
		bi = 4'd4;
		value_blk = ai+bi;
		value_non <=ai+bi;
		
		ai2 <= 4'd5;
		bi2 <= 4'd6;
		value_non2 <= ai2+bi2;
		//发现这里value_none2使用的旧的ai2和bi2
	end
	
	always begin
		#10;
		if($time >=1000) $finish
	end
endmodule

使用非阻塞赋值避免竞争冒险关系: timing不好,容易阻塞 baka!baka!baka!baka!:

always @(posedge clk) begin
	a = b;
end

always @(posedge clk) begin
	b = a;
end
//非常容易竞争冒险 拉完了
always @(posedge clk) begin
	temp = a;
	a = b;
	b = temp;
end
//多写个temp 拉完了
always @(posedge clk) begin
	a >= b;
	b >= a;
end
//bingo