门级:
- 使用逻辑门这一级别来描述,
and
、or
……, - 输出部分必须是net类型,门级原语本质是模块实例调用,符合端口连接规则。
RTL 中的寄存器和组合逻辑,直接反应了逻辑门直接的关系,更加接近底层,接近硬件,一般EDA工具可以把RTL描述自动编译为门级描述。所以一般不直接使用门级编程。
module Full_Add_1b_3( A, B, Cin, Sum, Cout );
input A;
input B;
input Cin;
output Sum;
output Cout;
wire S1, T1, T2, T3; // -- statements -- //
xor x1 (S1, A, B);
xor x2 (Sum, S1, Cin);
and A1 (T3, A, B );
and A2 (T2, B, Cin);
and A3 (T1, A, Cin);
or O1 (Cout, T1, T2, T3 );
endmodule
//两位全加器
`include "Full_Add_1b_3.v"
module Full_Add_2b_3( FA, FB, FCin, FSum, FCout ) ;
parameter SIZE = 2;
input [SIZE:1] FA;
input [SIZE:1] FB;
input FCin;
output [SIZE:1] FSum;
output FCout;
wire FTemp;
Full_Add_1b_3 FA1( .A (FA[1]), .B (FB[1]), .Cin (FCin) , .Sum (FSum[1]), .Cout (FTemp));
Full_Add_1b_3 FA2( .A (FA[2]), .B (FB[2]), .Cin (FTemp) , .Sum (FSum[2]), .Cout (FCout));
endmodule
RTL级:
- 基本语句为连续赋值语句:
assign;
- 左值必须是net类型,右值无要求
使用寄存器这一级别的描述方式来描述电路的数据流方式。RTL在很大程度上是对流水线原理图的描述。接近实际电路结构的描述,可以精确描述电路的原理、执行顺序等。其目的在于可综合。
module Full_Add_4b_1( A, B, Cin, Sum, Cout );
input[3:0] A;
input[3:0] B;
input Cin;
output[3:0] Sum;
output Cout;
assign {Cout, Sum} = A + B + Cin;
endmodule
行为级:
- 结构化过程语句:
initial
和always,通常借助一些(+)(-)等运算符;
- 左值必须是reg类型,右值无要求;
- 过程赋值语句。
module Full_Add_4b_2( A, B, Cin, Sum, Cout );
input[3:0] A;
input[3:0] B;
input Cin;
output[3:0] Sum;
output Cout;
reg [3:0] Sum;
reg Cout;
always @(A or B or Cin) begin
{Cout, Sum} <= A + B + Cin;
end
endmodule
教材中:模块的两种描述方式
Verilog的数据流、行为、结构化与RTL级描述_浩瀚之水_csdn的博客-CSDN博客_verilog结构化描述