FPGA进行一个多路选择器的编写,附带testbench

First Post:
Last Update:

multiplexer.v文件内容如下:

1
2
3
4
5
6
7
8
9
10
module multiplexer (
input a,b,sel,
output reg out // 使用always的output必须是reg
);
always@(a or b or sel)
if(!sel)
out = a;
else
out = b;
endmodule //multiplexer

tb_multiplexer文件(testbench)内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
`timescale  1ns/1ns  // 时间尺度预编译指令 定义模块的仿真时的时间单位和时间精度
module tb_multiplexer ();
reg a; //tb文件中待测试RTL模块的输入永远是reg型变量
reg b;
reg sel;
wire out; // 在testbench中待测试RTL模块的输出永远是wire型变量

/*
* initial初始化赋值
*/
initial
begin
a = 1'b0; // 赋值为二进制0
b = 1'b0;
sel = 1'b0;
end

/*
* 创建随机输入值
*/
always #10 a <= {$random} % 2; // 取模求余数,产生非负随机数0、1,每隔10ns产生一次随机数
always #10 b <= {$random} % 2;
always #10 sel <= {$random} % 2;

/*
* 例化函数输入
* 其实就是把a,b,sel变量的值输入到函数里面
* 类似于函数的调用
*/
multiplexer multiplexer_init
(
.a(a),
.b(b),
.sel(sel),
.out(out)
);
endmodule //tb_multiplexer

有趣的一点是,第一个模组里面的reg实际上并没有用到.这个可以通过查看RTL Viewer可以看见.非常贴心的给优化掉了.具体内容可以查看 Verilog中assign和always的关键词详解.