题解 | #使用子模块实现三输入数的大小比较#
https://www.nowcoder.com/practice/bfc9e2f37fe84c678f6fd04dbce0ad27
`timescale 1ns/1ns module main_mod( input clk, input rst_n, input [7:0]a, input [7:0]b, input [7:0]c, output wire [7:0]d ); //wire类型变量 wire [7:0]data_temp1; wire [7:0]data_temp2; //**************a,b中较小值给data_temp1****************************// cpr cpr_inst1( .clk(clk), .rst_n(rst_n), .data_a(a), .data_b(b), .data_d(data_temp1) ); //*************a,c中较小值给data_temp2************************// cpr cpr_inst2( .clk(clk), .rst_n(rst_n), .data_a(a), .data_b(c), .data_d(data_temp2) ); //*************temp1,temp2中较小值给d************************// cpr cpr_inst3( .clk(clk), .rst_n(rst_n), .data_a(data_temp1), .data_b(data_temp2), .data_d(d) ); endmodule //***********************sub model ******************************// module cpr( input clk, input rst_n, input [7:0]data_a, input [7:0]data_b, output reg [7:0]data_d ); always @(posedge clk or negedge rst_n)begin if(!rst_n) data_d<=8'b0; else data_d<=(data_a<data_b)?data_a:data_b; end endmodule
最开始的想法是先比较a,b中的较小值存入data_temp1,再比较data_temp1与c最终得到a,b,c三个数中的最小值,所以只例化了两次子模块; 但没有考虑到子模块例化是并行执行的,所以开始结果出现了错误; 最后采用例化三次的方式正确执行,前面两次分别比较a,b和a,c两组中的最小值分别存入data_temp1、data_temp2,最后一次例化比较data_temp1、data_temp2的大小 (看了讨论区大佬的发言,知道其实也可以只例化两次,只是需要第二次例化前进行多打一拍的操作,否则第二次例化比较的并不是data_temp(a,b中的较小值)和原来的c。