// 模块功能说明
// 当方向控制信号“wr_”为“1”时,y_作为输出,值为输入信号a_的值
// 当方向控制信号“wr_”为“0”时,y_作为输入,输出信号b_值为信号y_的值
module bidirection_gate1(
input a,
input wr,
output b,
inout y
);
assign y = wr ? a : 1'bz;
assign b = wr ? 1'bz : y;
endmodule
仿真激励文件编写:初学FPGA发现存在inout端口,这时在编写仿真激励文件时犯难了,应该定义该端口为input的reg型,还是output的wire型?这里记录一下学习过程
首先将需要测试模块的input端口都定义成reg型,output端口定义成wire型,然后再定义inout端口的类型为reg,并对每个inout端口定义一个wire型寄存器映射。
现在看此例程:input端口a,wr设置为reg型,output端口b 设置为wire型,inout端口y设置成reg型,并配一个wire型寄存器映射y_wire。:
对输入信号赋初值:
对wr使能信号和inout端口赋值(这里是重点):
使能信号wr每隔100变换一次状态这个不必多说,方便看每种状态时的测试信号。y_wire为inout端口,需要将它传入被测模块的inout端口。根据功能描述,当wr为1时inout端口作为输出,需要将其状态变为高阻态;当wr为0时inout端口作为输入,其值y的值,是我们的激励信号。
接下来进行仿真:
波形信号,a为输入,b 为输出,wr 为输入控制信号,y(注意此y非彼y,这个y只是我们的激励信号y不是传入模块的y),y_wire是传入模块y端口的信号。从仿真波形可知wr为1时inout端口作为输出,输出值为a的值,从波形可以发现输出inout端口为输出(即y_wire为输出),其值与a一致;当wr为0时,inout端口作为输入,其输出值为y(即我们给的激励信号y波形的值,此时的输出端口为b),wr为0时,从波形可以看出输出信号b,inout端口作为输入的信号y_wire的值与y一致 。
以下为仿真测试文件:
// bidirection_gate
module tb_train_demo();
// inputs
reg a;
reg wr;
// outputs
wire b;
// inout
reg y;
wire y_wire;
bidirection_gate1 u_bidirection_gate1(
.a(a),
.wr(wr),
.y(y_wire),
.b(b)
);
initial begin
a = 0;
wr = 1;
y = 0;
while(1)begin
#5;
a = {$random};
y = {$random};
end
end
always #100 wr = ~ wr;
assign y_wire = wr ? 1'bz : y;
endmodule