Verilog 模块和端口
模块
module module_name
(port_list);
Declarations_and_Statements;
endmodule
端口
是模块与外界交互的端口,模块内部不可见,对模块的调用通过端口连接进行
端口列表
模块的定义中包含一个可选的端口列表,一般将不带类型、不带位宽的信号变量罗列在模块声明里。下面是一个 PAD 模型的端口列表:
module pad(
DIN,OEN,PULL,
DOUT,PAD);
若是和外部没有交互,则不用声明
端口声明
- 端口信号罗列出来后,可以在模块实体中声明了
input、inout不能声明为reg数据类型,因为reg是用于保存数值的,输入端口只能反应与器相连的外部信号的变化,不能保存这些信号的值output可以声明为wire和reg数据类型。
//端口类型声明
input DIN,OEN;
input [1:0] PULL;
inout PAD;
output DOUT;
//端口数据类型声明
wire DIN,OEN;
wire [1:0] PULL;
wire PAD;
reg DOUT;
Verilog中,端口隐式的声明为wire变量,即当端口具有wire属性时,不用再次声明端口类型为wire型。但是,当端口有reg属性,则reg声明不可省略
input DIN,OEN;
input [1:0] PULL;
input PAD;
output DOUT;
reg DOUT;
//output reg DOUT;
- 还有1种更简洁的方法来声明端口,即在声明
module时就陈列其端口及其类型,reg端口要么在module声明时声明,要么在module实体中声明,如:
module pad(
input DIN,OEN,
input [1:0] PULL,
input PAD,
output reg DOUT
);
module pad(
input DIN,OEN,
input [1:0] PULL,
inout PAD,
output DOUT
);
reg DOUT;
inout端口仿真
module pad(
input DIN,OEN,
input [1:0] PULL,
input PAD,
output reg DOUT
);
assign PAD=OEN?'bz:DIN;
//input:(PAD->DOUT)
always @(*) begin
if(OEN == 1) begin
DOUT = PAD;
end
else begin
DOUT = 'bz;
end
end
bufif1 puller(PAD,PULL[0],PULL[1]);
endmodule