前言
此文介绍了十位计数器的verilog代码编写以及使用vcs的仿真流程。
10位计数器
具体代码如下
`timescale 1ns/1ps
module tb();
reg clk;
reg rstn;
wire [3:0]cnt;
counter dut(.clk(clk),
.rst(rstn),
.cnt(cnt)
);
initial begin
clk <= 0;
forever begin
#5 clk <= !clk;
end
end
initial begin
#500 $finish;
end
initial begin
#10 rstn <= 0;
repeat(2) @(posedge clk);
rstn <= 1;
end
endmodule
module counter(clk, rst, cnt);
input clk, rst;
output [3:0]cnt;
reg [3:0]cnt;
wire [3:0] sum;
assign sum = cnt + 1;
always @(posedge clk or negedge rst)
begin
if (!rst)
cnt <= 0;
else if (cnt > 4'b1000)
cnt <= 0;
else
cnt <= sum;
end
endmodule
此计数器在每个时钟上升沿计数加1,且从0计数到9以后自动清零。
仿真波形图如下
vcs编译仿真方法
在代码文件所在目录输入
vcs counter_10.v -debug
注:图片中文件命名错误,应该为counter_10.v
编译以后,会产生一个simv文件,此文件用于dve仿真
然后输入命令如下
./simv -gui
即可打开dve软件,然后添加波形开始仿真即可出现波形。
删除编译仿真产生的文件
如上图,编译仿真以后会产生一些多余文件。
可输入以下命令删除
rm -r csrc DVEfiles simv.daidir *.vpd simv *.key
可以看见,多余文件以及被全部删除了。
问题记录
- testbench代码块中的module只有模块名字,不能有端口列表。
- 同样在tb中,初始化复位值应该为0,先进行全局复位,当设置初始复位值为1时,仿真开始时,cnt一直为x不确定态。
- #500 $finish代码应该单独放 即
initial begin
#500 $finish;
end