連續(xù)賦值語(yǔ)句是 Verilog 數(shù)據(jù)流建模的基本語(yǔ)句,用于對(duì) wire 型變量進(jìn)行賦值。
格式如下:
assign LHS_target = RHS_expression ;
LHS(left hand side) 指賦值操作的左側(cè),RHS(right hand side)指賦值操作的右側(cè)。
?assign
?為關(guān)鍵詞,任何已經(jīng)聲明 wire 變量的連續(xù)賦值語(yǔ)句都是以 ?assign
?開(kāi)頭,例如:
wire Cout, A, B ;
assign Cout = A & B ; //實(shí)現(xiàn)計(jì)算A與B的功能
需要說(shuō)明的是:
LHS_target
? 必須是一個(gè)標(biāo)量或者線型向量,而不能是寄存器類(lèi)型。RHS_expression
的類(lèi)型沒(méi)有要求,可以是標(biāo)量或線型或存器向量,也可以是函數(shù)調(diào)用。RHS_expression
表達(dá)式的操作數(shù)有事件發(fā)生(值的變化)時(shí),?RHS_expression
就會(huì)立刻重新計(jì)算,同時(shí)賦值給 ?LHS_target
?。Verilog 還提供了另一種對(duì) wire 型賦值的簡(jiǎn)單方法,即在 wire 型變量聲明的時(shí)候同時(shí)對(duì)其賦值。wire 型變量只能被賦值一次,因此該種連續(xù)賦值方式也只能有一次。例如下面賦值方式和上面的賦值例子的賦值方式,效果都是一致的。
wire A, B ;
wire Cout = A & B ;
下面采用數(shù)據(jù)流描述方式,來(lái)設(shè)計(jì)一個(gè) 1bit 全加器。
設(shè) Ai,Bi,Ci 分別為被加數(shù)、加數(shù)和相鄰低位的進(jìn)位數(shù),So, Co 分別為本位和與向相鄰高位的進(jìn)位數(shù)。
真值表如下:
Input | Output | |||
---|---|---|---|---|
Ci | Ai | Bi | So | Co |
0 | 0 | 0 | 0 | 0 |
0 | 0 | 1 | 1 | 0 |
0 | 1 | 0 | 1 | 0 |
0 | 1 | 1 | 0 | 1 |
1 | 0 | 0 | 1 | 0 |
1 | 0 | 1 | 0 | 1 |
1 | 1 | 0 | 0 | 1 |
1 | 1 | 1 | 1 | 1 |
全加器的表達(dá)式為:
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
當(dāng)然,更為貼近加法器的代碼描述可以為:
module full_adder1(
input Ai, Bi, Ci
output So, Co);
assign {Co, So} = Ai + Bi + Ci ;
endmodule
testbench(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
仿真結(jié)果如下:
點(diǎn)擊這里下載源碼
更多建議: