:::danger 【知识点】
module main_mod( input clk, input rst_n, input [7:0]a, input [7:0]b, input [7:0]c,
output [7:0]d );
wire [7:0] tmp1; child_mod U0( .clk (clk), .rst_n (rst_n), .a (a), .b (b), .c (tmp1) );
wire [7:0] tmp2; child_mod U1( .clk (clk), .rst_n (rst_n), .a (a), .b (c), .c (tmp2) );
child_mod U3( .clk (clk), .rst_n (rst_n), .a (tmp1), .b (tmp2), .c (d) );
endmodule
module child_mod( input clk, input rst_n, input [7:0]a, input [7:0]b,
output [7:0]c );
reg [7:0] c_reg; always @(posedge clk or negedge rst_n) begin if(!rst_n) begin c_reg <= 8’b0; end else begin if(a < b) begin c_reg <= a; end else begin c_reg <= b; end end end assign c = c_reg;
endmodule
:::info
【注】
1. 父类模块中例化子类模块的方法:
模块名称child_mod 例化后的新名称U0(<br />.clk原模块引脚名 (现在传入引脚的名字) 以此完成映射关系<br />);
2. 映射的时候,原模块的引脚名和在现模块中的变量必须是同一类型。都是wire类型才能够完成映射。
:::
<a name="AfdGq"></a>
# 1.9.2 Testbench验证
```verilog
`timescale 1ns/1ns
module tb;
bit clk;
bit rst_n;
reg [7:0] a;
reg [7:0] b;
reg [7:0] c;
reg [7:0] d;
main_mod U0(
.clk (clk),
.rst_n (rst_n),
.a (a),
.b (b),
.c (c),
.d (d)
);
initial begin : gen_clk;
forever #5 clk <= !clk;
end
initial begin
clk = 0;
rst_n = 0;
d = 8'b0;
#20;
rst_n = 1;
a = 8'b1000_0000;
b = 8'b0100_0000;
c = 8'b0010_0000;
#20;
a = 8'b0010_0110;
b = 8'b0100_0000;
c = 8'b1100_0000;
#20;
a = 8'b0100_0000;
b = 8'b0010_1111;
c = 8'b1000_0000;
#10;
$finish();
end
endmodule
:::info tb验证过程中遇到的问题:
- 波形采样不到输出信号,debug发现是rst信号拉低以后没有拉高;
- initial过程块中需要给定输出、时钟信号、复位信号的初始状态。 :::