本文已参与「新人创作礼」活动,一起开启掘金创作之路。
在学习Verilog硬件编程语言时,写完一个module,仍需要进行仿真下看是否运算结果正确,像高级语言中可以打印在Windows上,单片机编程时可以用串口打出来数据一样,我们仍需要验证我们写的对不对。
如果你对你的硬件水平非常自信,那可以编程完后直接弄出RTL电路来,看是否真确。
如果电路看不懂,那就可以用波形图进行仿真。
准备工具:
一个正确无误的module(最好别有Warnning)、工程下建立一个.vwf文件(that‘s all)。
下面我们拿例子说话:
这是一个8-3优先编码器,最高位优先级最高。
然后打开我们的.vwf
然后:
咱看下结果:
符合代码吧,从左到右第四位数是0,那么编码为3.
我们再看一个时序图的仿真案例:
模为60的BCD码计数器的设计与验证
step1:实现module:
module DigitalCountBCD60(clk_50M,rst_n,time_cnt);
input clk_50M;
input rst_n;
output [7:0]time_cnt;
reg [7:0]time_cnt;
reg [7:0]time_cnt_n;
always@(posedge clk_50M or negedge rst_n)
begin
if(!rst_n)
time_cnt_n=7'b0;
else begin
if(time_cnt_n[3:0] == 9)begin
time_cnt_n[3:0] = 4'b0000;
if(time_cnt_n[7:4] == 5)
time_cnt_n[7:4] = 0;
else
time_cnt_n[7:4] = time_cnt_n[7:4]+4'b0001;
end
else
time_cnt_n[3:0] = time_cnt_n[3:0]+4'b0001;
end
time_cnt = time_cnt_n/16*10 + time_cnt_n%16;
end
endmodule
step2:编写testbench:
【notice】在写tb文件时,输入参量一定要有个初值。
//输入参量需要有一个变化的过程。。
initial begin
clk_50M=0;
rst_n=0;
#10 rst_n=1;
forever #5 clk_50M=~clk_50M;
end
DigitalCountBCD60 u1(clk_50M,rst_n,time_cnt);
initial $monitor($time,,,"clk_50M = %b rst_n = %b time_cnt = %d ",clk_50M,rst_n,time_cnt);
endmodule
step3:仿真
打印出来的结果
\