:::danger 【知识点】

  1. 父类模块对子类模块的例化和调用;
  2. 子类模块中引脚到父类模块中信号的例化和映射; ::: image.png

    1.9.1 设计代码实现

    ``verilogtimescale 1ns/1ns

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

  1. :::info
  2. 【注】
  3. 1. 父类模块中例化子类模块的方法:
  4. 模块名称child_mod 例化后的新名称U0(<br />.clk原模块引脚名 (现在传入引脚的名字) 以此完成映射关系<br />);
  5. 2. 映射的时候,原模块的引脚名和在现模块中的变量必须是同一类型。都是wire类型才能够完成映射。
  6. :::
  7. <a name="AfdGq"></a>
  8. # 1.9.2 Testbench验证
  9. ```verilog
  10. `timescale 1ns/1ns
  11. module tb;
  12. bit clk;
  13. bit rst_n;
  14. reg [7:0] a;
  15. reg [7:0] b;
  16. reg [7:0] c;
  17. reg [7:0] d;
  18. main_mod U0(
  19. .clk (clk),
  20. .rst_n (rst_n),
  21. .a (a),
  22. .b (b),
  23. .c (c),
  24. .d (d)
  25. );
  26. initial begin : gen_clk;
  27. forever #5 clk <= !clk;
  28. end
  29. initial begin
  30. clk = 0;
  31. rst_n = 0;
  32. d = 8'b0;
  33. #20;
  34. rst_n = 1;
  35. a = 8'b1000_0000;
  36. b = 8'b0100_0000;
  37. c = 8'b0010_0000;
  38. #20;
  39. a = 8'b0010_0110;
  40. b = 8'b0100_0000;
  41. c = 8'b1100_0000;
  42. #20;
  43. a = 8'b0100_0000;
  44. b = 8'b0010_1111;
  45. c = 8'b1000_0000;
  46. #10;
  47. $finish();
  48. end
  49. endmodule

:::info tb验证过程中遇到的问题:

  • 波形采样不到输出信号,debug发现是rst信号拉低以后没有拉高;
  • initial过程块中需要给定输出、时钟信号、复位信号的初始状态。 ::: image.png