1. 题目
2. RTL实现
两种实现方式:case 和if-else-if。
`timescale 1ns/1ps
module mux4_1
(
input [1:0] d1,d2,d3,d0,
input [1:0] sel,
output [1:0] mux_out
);
//***********case**********//
reg [1:0] mux_out_temp;
always@(*)begin
case(sel)
2'b00: mux_out_temp = d3;
2'b01: mux_out_temp = d2;
2'b10: mux_out_temp = d1;
2'b11: mux_out_temp = d0;
default:mux_out_temp = d0;
endcase
end
//**********if-else-if******//
/*
always@(*)begin
if(sel == 2'b00)
mux_out_temp = d3;
else if(sel == 2'b01)
mux_out_temp = d2;
else if(sel == 2'b10)
mux_out_temp = d1;
else if(sel == 2'b11)
mux_out_temp = d0;
end
*/
assign mux_out = mux_out_temp;
endmodule
3. Tb
testbench加入了固定测试和随机测试。
`timescale 1ns/1ps
module tb ();
reg [1:0] d0;
reg [1:0] d1;
reg [1:0] d2;
reg [1:0] d3;
reg [1:0] sel;
reg [1:0] mux_out;
initial begin
d0 = 2'b11;
d1 = 2'b00;
d2 = 2'b01;
d3 = 2'b10;
//**** fixed testing ****//
case_4(sel,2'b00);
case_4(sel,2'b01);
case_4(sel,2'b10);
case_4(sel,2'b11);
//**** random testing ****//
repeat(100)begin
case_random(sel);
end
#100 $finish();
end
//******test task*******//
task case_4;
output [1:0] a;
input [1:0] b;
case(b)
2'b00 : a = 2'b00;
2'b01 : #1 a = 2'b01;
2'b10 : #1 a = 2'b10;
2'b11 : #1 a = 2'b11;
endcase
endtask
//**** random task ******//
task case_random;
output [1:0] a;
#1 a = {$random} % 4;
endtask
//*****result comparison*****//
always@(mux_out)begin
if(mux_out == sel)begin
$display("Expected result: %d",sel);
$display("Actual result: %d",mux_out);
$display("Test pass!\n");
end else if({!mux_out[1],mux_out[0]} == sel)begin
$display("Expected result: %d",sel);
$display("Actual result: %d",mux_out);
$display("Test pass!\n");
end else begin
$display("Expected result: %d",sel);
$display("Actual result: %d",mux_out);
$display("Error!,sel=%d,mux_out=%d\n",sel,mux_out);
end
end
//*****generate waveform file *****//
initial begin
$fsdbDumpfile("tb.fsdb");
$fsdbDumpvars(0,tb);
end
mux4_1 U1
(
.d0 (d0),
.d1 (d1),
.d2 (d2),
.d3 (d3),
.sel (sel),
.mux_out (mux_out)
);
endmodule
4. 仿真结果