作者:小白蒋
7年材料专业转行芯片验证,两年芯片验证工作经验。
题目:
制作一个四选一的多路选择器,要求输出定义上为线网类型
状态转换:
d0 11
d1 10
d2 01
d3 00
信号示意图:
波形示意图:
输入描述:
输入信号 d1,d2,d3,d4 sel
类型 wire
输出描述:
输出信号 mux_out
类型 wire
解答:
设计代码实现:
在命令行敲入 g mux4.sv
,然后复制下面内容
`timescale 1ns/1ns
module mux4_1(
input [1:0]d1,d2,d3,d0,
input [1:0]sel,
output[1:0]mux_out
);
//*************code***********//
reg [1:0] mux_out_tmp;
always@(*) begin
case(sel)
2'b00: mux_out_tmp = d3;
2'b01: mux_out_tmp = d2;
2'b10: mux_out_tmp = d1;
2'b11: mux_out_tmp = d0;
default: mux_out_tmp = d3;
endcase
end
assign mux_out = mux_out_tmp;
//*************code***********//
endmodule
验证平台实现:
在命令行敲入g mux4_tb.sv
,然后复制下面代码:
`timescale 1ns/1ps
module tb_top();
logic [1:0] D0;
logic [1:0] D1;
logic [1:0] D2;
logic [1:0] D3;
logic [1:0] SEL;
logic [1:0] MUX_OUT;
logic clk;
initial begin
#0;
clk = 1;
#20;
forever #50 clk = ~clk;
end
initial begin
D0 = 'h0;
D1 = 'h1;
D2 = 'h2;
D3 = 'h3;
SEL = 'h2;
$display("At time:%t, MUX_OUT:%h", $time, MUX_OUT);
repeat(5) @(posedge clk);
SEL = 'h3;
$display("At time:%t, MUX_OUT:%h", $time, MUX_OUT);
repeat(3) @(posedge clk);
SEL = 'h1;
$display("At time:%t, MUX_OUT:%h", $time, MUX_OUT);
repeat(2) @(posedge clk);
$finish;
end
mux4_1 u0_mux4_1 (
.d0(D0),
.d1(D1),
.d2(D2),
.d3(D3),
.sel(SEL),
.mux_out(MUX_OUT)
);
initial begin
$fsdbDumpfile("tb_top.fsdb");
$fsdbDumpvars(0, tb_top);
end
endmodule
makefile脚本实现:
在命令行敲入g makefile
,复制下面代码
#-----------------------------------------------------------
#// FileName: makefile
#// Creator: xiaobaijiang
#// time: 2022-04-21
#// wchat: jianfuk
#//-----------------------------------------------------------
run:
vcs -R -full64 +v2k -fsdb -sverilog mux4.v mux4_tb.sv -l run.log
verdi:
verdi -sv mux4.v mux4_tb.sv -ssf tb_top.fsdb &
clean:
@rm -rf verdiLog *.log *.fsdb csrc ucli.key simv* *.conf *.rc
仿真看波形:
命令行输入make run
,可以看到下面打印信息:
输入make verdi
查看波形:
更多芯片验证自学教程,请访问->传送门