模块
Verilog语言中的基本描述单位是模块。模块描述某个设计的功能或结构,以及它与其他外部模块进行通信的端口。使用开关级原语、门级原语和用户定义的原语可以对设计的结构进行描述;使用连续赋值语句可以对设计的数据流行为进行描述;使用过程性结构可以对时序行为进行描述。
模块基本语法结构如下
module module_name ( port_list) :
Declarations:
reg, wire, parameter,
input, output, inout,
function, task, ...
Statements:
Initial statement
Always statement
Module instantiation
Gate instantiation
UDP instantiation
Continuous assignment
Generate statement
endmodule
在模块中,可以使用下面4种风格对设计进行描述:
- 数据流风格
- 行为风格
- 结构风格
- 上述描述风格的混合
数据流风格
用于建立组合逻辑电路行为模型。以数据流风格对设计进行建模的基本机制就是使用连续赋值语句,通过使用关键词 assign 对线网进行赋值(不能对寄存器进行赋值)
Verilog HDL有两大类数据类型
- 线性类型:表示结构化元件间的物理连线。常见类型:wire
- 变量类型:表示一个抽象的数据存储单元。共5种变量类型:reg、memories、integer、time、real(realtime)
//1位全加器的数据流方式描述
module full_adder_dataflow(a, b, carry_in, sum, carry_out);
input a, b, carry_in;
output sum, carry_out;
assign sum = a^b^carry_in;
assign carry_out = (a&carry_in)|(b&carry_in)|(a&b);
endmodule
行为风格
用于建立时序逻辑电路行为模型。
行为级建模的主要结构:
- initial语句。只执行一次。
- always语句。循环执行,可由触发条件触发执行。
一个模块可以包括任意多条initial语句或always语句。同时这些语句间并行执行,与顺序无关。只有变量类型数据能够在这两种语句中被赋值。
//1位全加器的行为方式描述
module full_seq(a, b, carry_in, sum, carry_out);
input a, b, carry_in;
output reg sum, carry_out;
reg t1, t2, t3;
always
@(a or b or carry_in) begin
sum <= (a^b)^carry_in;
t1 = a&carry_in;
t2 = b&carry_in;
t3 = a&b;
carry_out <= (t1|t2)|t3;
end
endmodule
语句块
- 顺序语句块(begin end)
- 并行语句块(fork join)
过程赋值语句
- 阻塞过程性赋值(=)
- 非阻塞过程性赋值(<=)
语句类型
条件语句 if else
case语句
循环语句forever语句
repeat语句
while语句
for语句
结构风格
用于描述电路结构模型。
在Verilog HDL中,可以使用以下4种构造对电路结构进行描述:
- 内建门级基元:在门级描述电路
- 开关级基元:在晶体管级描述电路
- 用户定义基元:在门级描述电路
- 模块实例:创建层级结构描述电路
Verilog HDL提供下列内建基元门:
- 多输入门:and、 nand、or、 nor、xor、xnor。
- 多输出门:buf(缓冲门)、not(非门)。
- 三态门:bufif0、bufif1、notif0、notif1。
- 上拉、下拉门:pullup、pulldown。
- MOS开关:cmos、nmos、pmos、rcmos、rnmos、rpmos。
- 双向开关:tran、tranif0、tranif1、rtran、rtranif0、rtranif1。
//4选1多路器门级描述
module mux4x1(y, d0, d1, d2, d3, s0, s1);
input d0, d1, d2, d3, s0, s1;
output y;
and (t0, d0, s0bar, s1bar),
(t1, d1, s0bar, s1),
(t2, d2, s0, s1bar),
(t3, d3, s0, s1);
not (s0bar, s0),
(s1bar, s1);
or (y, t0, t1, t2, t3,);
endmodule
//4选1多路器UDP描述
primitive mux4x1(y, d0, d1, d2, d3, s0, s1);
input d0, d1, d2, d3, s0, s1;
output y;
table
//真值表
endtable
endprimitive
补充
如何实现各风格转化
真值表 -> 逻辑表达式 -> 门级结构
(懒得写了,数电知识)