FPGA 学习仿真硬件设计
- 封装常用的testbench,使用task或function进行代码封装,以便下次灵活调用。
- 当待测试文件中存在双向信号(inout)时,需要使用reg变量表示输入和wire变量表示输出。
- 尽量避免单个initial语句过于复杂,可以分开写成多个initial语句,以方便阅读和修改。
- 了解testbench是依赖于PC软件平台的,必须与设计的硬件功能相匹配。
具体来说,我们可以看一个简单的例子,如下所示:
```verilog
module add(a,b,c,d,e); // 模块接口
input [5:0] a; // 输入信号a
input [5:0] b; // 输入信号b
input [5:0] c; // 输入信号c
input [5:0] d; // 输入信号d
output [7:0] e; // 求和输出信号
wire [6:0] outa1, outa2; // 定义输出网线型
assign e = outa2 + outa1; // 合并两部分输出结果
// adder子模块
adder u1 (.ina(a), .inb(b), .outa(outa1)); // 调用adder模块,自定义名字为u1
adder u2 (.ina(c), .inb(d), .outa(outa2)); // 调用adder模块,自定义名字为u2
endmodule
module adder(ina, inb, outa); // 模块接口
input [5:0] ina; // 输入信号 ina
input [5:0] inb; // 输入信号 inb
output [6:0] outa; // 输出信号 outa
assign outa = ina + inb; // 求和
endmodule
```
在这段代码中,我们定义了一个add模块和一个adder子模块,用于实现加法功能。在仿真文件中,我们可以初始化输入信号并进行仿真测试。通过编写这样的testbench,我们可以验证设计的功能是否符合预期,从而确保FPGA设计的正确性。