天天看點

verilog基礎設計9-小米數字ic筆試題 對8輸入進行排序

1、給定8各并行輸入,對并行輸入的8個資料,進行排序,要求在單周期内完成。

    題目給定了一個2輸入的比較器,要求基于此二輸入的比較器進行設計,此二輸入比較器是以函數封裝的,要求以最少的二輸入比較器進行設計

function [DW*2-1:0] max_2;
    input [DW-1:0] a;
    input [DW-1:0] b;
    begin
        max_2 = (a>=b)? ({b[DW-1:0],a[DW-1:0]}):({a[DW-1:0],b[DW-1:0]});
    end

endfunction
           

2、考試的時候沒有時間思考了,考後複盤一下

其實整體思路就是對,輸入的8各資料,進行分組
  • 前四個為一組:in_0,in_1,in_2,in_3  
        利用二輸入比較器,建構一個四輸入比較器,對這組資料進行排序,将這四個資料的大小順序排出來,這裡描述為     A<B<C<D
  •  後四個為一組:in_4,in_5,in_6,in_7
        同理,  E<F<G<H
  • 得到這樣的順序後,再根據

        D和H的大小,得出最大的,

        A和E的大小,得到最小的

我畫了個圖:虛線框代表一個四輸入比較器

verilog基礎設計9-小米數字ic筆試題 對8輸入進行排序

3、代碼設計

代碼這裡與圖略有差別,後面的4個變量我直接用了個四輸入比較器

module sort #(parameter  DW =8)(
    input wire [DW-1:0] in_0,
    input wire [DW-1:0] in_1,
    input wire [DW-1:0] in_2,
    input wire [DW-1:0] in_3,
    input wire [DW-1:0] in_4,
    input wire [DW-1:0] in_5,
    input wire [DW-1:0] in_6,
    input wire [DW-1:0] in_7,
    output reg [DW-1:0] out_0,
    output reg [DW-1:0] out_1,
    output reg [DW-1:0] out_2,
    output reg [DW-1:0] out_3,
    output reg [DW-1:0] out_4,
    output reg [DW-1:0] out_5,
    output reg [DW-1:0] out_6,
    output reg [DW-1:0] out_7
);

reg [DW*2-1:0] out_temp0,out_temp1,out_temp2,out_temp3,
               out_temp4,out_temp5,out_temp6,out_temp7,out_temp8;

reg [DW*4-1:0] compare4_in1,compare4_in2;
reg [DW*4-1:0] out_comp4;

always @(*) begin
    compare4_in1 = max_4_in(in_0,in_1,in_2,in_3);
    compare4_in2 = max_4_in(in_4,in_5,in_6,in_7);
end

//得出最小值和最大值
always @(*) begin
    out_temp3 = max_2(compare4_in1[DW-1:0],compare4_in2[DW-1:0]);//最大值
    out_temp2 = max_2(compare4_in1[DW*4-1:DW*3],compare4_in2[DW*4-1:DW*3]);//最小值
    
    out_7 = out_temp3[DW-1:0];
    out_0 = out_temp2[DW*2-1:DW];
end

//得到次小值和次大值
always @(*) begin
    //1-5号比大小
    out_temp0 = max_2(compare4_in1[DW*3-1:DW*2],compare4_in2[DW*3-1:DW*2]);//次小值
    //2-6号比大小
    out_temp1 = max_2(compare4_in1[DW*2-1:DW],compare4_in2[DW*2-1:DW]);//次大值
    //找到2-6最大的,與3-7之間較小的相比,找到次大值
    out_temp4 = max_2(out_temp1[DW-1:0],out_temp3[DW*2-1:DW]);
    //找到1-5最小的,與0-4之間較大的比較,找到次小值
    out_temp5 = max_2(out_temp0[DW*2-1:DW],out_temp2[DW-1:0]);
    //次大值
    out_6 = out_temp4[DW-1:0];
    //次小值
    out_1 = out_temp5[DW*2-1:DW];
end

/*
//--||||--//c-out_temp0[DW-1:0] D-out_temp1[DW*2-1:DW] G- out_temp4[DW*2-1:DW] A-out_temp5[DW-1:0];
always @(*) begin
    out_temp6 = max_2(out_temp0[DW-1:0],out_temp4[DW*2-1:DW]);
    out_temp7 = max_2(out_temp5[DW-1:0],out_temp1[DW*2-1:DW]);
    out_temp8 = max_2(out_temp6[DW-1:0],out_temp7[DW*2-1:DW]);
    out_2 = out_temp6[DW*2-1:DW];
    out_3 = out_temp8[DW*2-1:DW];
    out_4 = out_temp8[DW-1:0];
    out_5 = out_temp7[DW-1:0];
end
*/


//接入四輸入
//out_temp0[DW-1:0] out_temp1[DW*2-1:DW] out_temp4[DW*2-1:DW] out_temp5[DW-1:0];
always @(*) begin
    out_comp4 = max_4_in(out_temp0[DW-1:0],out_temp1[DW*2-1:DW],out_temp4[DW*2-1:DW],out_temp5[DW-1:0]);
    out_2 = out_comp4[DW*4-1:DW*3];
    out_3 = out_comp4[DW*3-1:DW*2];
    out_4 = out_comp4[DW*2-1:DW];
    out_5 = out_comp4[DW-1:0];
end


//構造4輸入比較器
function [DW*4-1:0] max_4_in;
    input [DW-1:0] a;
    input [DW-1:0] b;
    input [DW-1:0] c;
    input [DW-1:0] d;
    reg [DW*2-1:0] temp1,temp2,temp3,temp4,temp5;
    begin
        temp1 = max_2(a,b);
        temp2 = max_2(c,d);
        temp3 = max_2(temp1[DW-1:0],temp2[DW-1:0]);
        temp4 = max_2(temp1[DW*2-1:DW],temp2[DW*2-1:DW]);
        temp5 = max_2(temp3[DW*2-1:DW],temp4[DW-1:0]);
        max_4_in ={temp4[DW*2-1:DW],temp5[DW*2-1:0],temp3[DW-1:0]};
    end
endfunction 

//2輸入比較器
function [DW*2-1:0] max_2;
    input [DW-1:0] a;
    input [DW-1:0] b;
    begin
        max_2 = (a>=b)? ({b[DW-1:0],a[DW-1:0]}):({a[DW-1:0],b[DW-1:0]});
    end

endfunction


endmodule 
           

4、tb檔案

`timescale 1ns/1ps
module tb_sort;

parameter   WDITH = 8; 
reg [WDITH -1 :0 ] in_0;
reg [WDITH -1 :0 ] in_1;
reg [WDITH -1 :0 ] in_2;
reg [WDITH -1 :0 ] in_3;
reg [WDITH -1 :0 ] in_4;
reg [WDITH -1 :0 ] in_5;
reg [WDITH -1 :0 ] in_6;
reg [WDITH -1 :0 ] in_7;

wire[WDITH -1 :0 ] out_0;
wire[WDITH -1 :0 ] out_1;
wire[WDITH -1 :0 ] out_2;
wire[WDITH -1 :0 ] out_3;
wire[WDITH -1 :0 ] out_4;
wire[WDITH -1 :0 ] out_5;
wire[WDITH -1 :0 ] out_6;
wire[WDITH -1 :0 ] out_7;


integer i;
initial begin
    in_0 = 0;
    in_1 = 0;
    in_2 = 0;
    in_3 = 0;
    in_4 = 0;
    in_5 = 0;
    in_6 = 0;
    in_7 = 0;
    
    for(i =0;i<20;i=i+1)begin
        #20;
        data_gen();
    end

end

task data_gen();
 begin
    in_0 = {$random}%256;
    in_1 = {$random}%256;
    in_0 = {$random}%256;
    in_1 = {$random}%256; 
    in_2 = {$random}%256; 
    in_3 = {$random}%256; 
    in_4 = {$random}%256; 
    in_5 = {$random}%256; 
    in_6 = {$random}%256; 
    in_7 = {$random}%256; 
    
 end
endtask 
 


sort #(.DW(8)) sort_inst(
      .in_0(in_0),
      .in_1(in_1),
      .in_2(in_2),
      .in_3(in_3),
      .in_4(in_4),
      .in_5(in_5),
      .in_6(in_6),
      .in_7(in_7),
      .out_0(out_0),
      .out_1(out_1),
      .out_2(out_2),
      .out_3(out_3),
      .out_4(out_4),
      .out_5(out_5),
      .out_6(out_6),
      .out_7(out_7)
);

endmodule 
           

 5、modelism 結果分析

verilog基礎設計9-小米數字ic筆試題 對8輸入進行排序

可以看出,這個8輸入比較器,功能基本正确,隻是我這裡一共用了21個2輸入比較器