Verilog包括四种抽象层次:
- 行为级或算法级:从算法角度进行设计,不关心具体的硬件实现和细节。
- 数据流级:描述数据如何在各个寄存器之间流动,如何处理这些数据。这是verilog支持的最高抽象层次。
- 门级:描述逻辑门及其连接关系。
- 开关级(晶体管级):描述晶体管及其连接关系。这是verilog支持的最低抽象层次。
我们常说的寄存器传输级(RTL,Register Transfer Level)一般是指行为级和数据流级建模。但我一直以来不太能区分开行为级和数据流级。最近重新看夏宇闻老师翻译的《Verilog HDL数字设计与综合》,发现了比较好的例子。
以四选一多路选择器为例,s0
和s1
是选择信号,i0
、i1
、i2
和i3
是输入的数据,out
为输出。数据流建模可以写为:
module muux4_to_1(
input i0,
input i1,
input i2,
input i3,
input s0,
input s1,
output out
);
assign out = (~s1&~s0&i0)|
(~s1& s0&i1)|
( s1&~s0&i2)|
( s1& s0&i3);
// 或者如下这样写
// assign out = s1? (s0? i3 : i2) : (s0? i1 : i0);
endmodule
行为级建模如下:
module muux4_to_1(
input i0,
input i1,
input i2,
input i3,
input s0,
input s1,
output reg out
);
always@(s1 or s2 or i0 or i2 or i3) begin
case({s1,s0})
2'b00: out = i0;
2'b01: out = i1;
2'b10: out = i2;
2'b11: out = i3;
default: out = 1'bx;
endcase
end
endmodule
可以简单总结出,数据流建模要清晰地写出数据之间的表达式关系,而行为级建模更像是C语言的思维,根据输入数据直接给出输出数据。