Verilog 连续赋值

assign、全加器

连续赋值是Verilog数据流建模的基本语句,用于对wire型变量进行赋值: 格式如下:

assign LHS_target = RHS_expression;

assign为关键词,任何已经声明wire变量的连续赋值语句都是以assign开头,如:

wire Cout,A,B;
assign Count = A&B;

需要说明的是:

  • LHS_target必须是标量或是线性向量,而不是寄存器类型
  • RHS_expression的类型没有要求,可以是标量或线型或存器向量,也可以是函数调用。
  • 只要RHS_expression表达式的操作数有事件发生,RHS_expression就会立刻重新计算,同时赋值给LHS_target Verilog还提供了另一种对wire型赋值的简单方法,即在wire型变量声明的时候同时对其赋值。wire型变量只能被赋值一次,因此该种连续赋值方式也只能有一次,如:
wire A,B;
wire Cout = A&B;

全加器

下面采用数据流描述方式,来设计一个1bit全加器 设Ai,Bi,Ci分别为被加数、加数和相邻低位的进位数,So,Co分别为本位和与向相邻高位的进位数。

CiAiBiSoCo
00000
00110
01010
01101
10010
10101
11001
11111
表达式如下:
So = Ai ⊕ Bi ⊕ Ci ;
Co = AiBi + Ci(Ai+Bi)

rtl代码(full_adder1.v)如下:

module full_adder1(
	input Ai,Bi,Ci,
	output So,Co);
	
	assign So = Ai^Bi^Ci;
	assign Co = (Ai&Bi)|(Ci&(Ai|Bi));
endmodule
module full_adder1(
	input Ai,Bi,Ci,
	output So,Co);
	
	assign {Co, So} = Ai + Bi + Ci ;
endmodule

tesrbench(test.sv)参考

`timescale 1ns/1ns

module test;
	reg Ai,Bi,Ci;
	wire So,Co;
	
	initial begin
		{Ai,Bi,Ci} = 3'b0;
		forever begin
		# 10;
		{Ai,Bi,Ci} = {Ai,Bi,Ci} + 1'b1;
		end
	end
	full_adder1 u_adder(
		.Ai     (Ai),
		.Bi     (Bi),
		.Ci     (Ci),
		.So     (So),
		.Co     (Co));
	initial begin
		forever begin
			#100;
			//$display("---gyc---%d",$time);
			if($time >= 1000)begin
			$finish
			end
		end
	end
endmodule