习惯了quartus和modelsim进行联合仿真,单独使用modelsim进行仿真的次数很少,导致有些细节很容易忘记,因此写下此博客来记录,方便以后回顾。
第一步:打开modelsim–>file–>new–>project
或者选择添加已经存在(exising file)的文件。
第二步:编译
第三步:开始仿真
这里注意选中testbench文件进行仿真
文件修改后需要重新编译
按住键盘的上下键可以切换已经输入过的命令,然后回车即可。
测试的例子
模块文件:
`timescale 1ns/1ns
module sequence_detect(
input clk,
input rst_n,
input data,
input data_valid,
output reg match
);
reg [3:0] tmp;
always@(posedge clk or negedge rst_n ) begin
if(!rst_n)begin
match<='b0;
tmp<='b0;
end
else if(!data_valid) begin
tmp<=tmp;
end
else begin
tmp<={tmp[2:0],data};
end
end
always@(posedge clk) begin
if(data_valid=='b0) begin
match<=1'b0;
end
else if(tmp==4'b0110)
match<='b1;
else
match<=0;
end
endmodule
tb.v文件
`timescale 1ns/1ns
module testbench();
reg clk,rst_n;
reg data;
reg data_valid;
wire match;
parameter clockPeriod=10;
//时钟信号产生模块
initial begin
clk=0;
forever
#(clockPeriod/2) clk= ~clk;//时钟经过(clockPeriod/2)ns就翻转一次
end
//给信号赋予初始值
initial begin
//clk = 0;
rst_n = 0;
data_valid=0;
#5 rst_n=1;//延迟5ns后,复位信号拉高
data_valid=1;
#10 data=0;
#10 data=1;
#10 data=1;
#10 data=0;
#10 data=0;
#10 data=1;
#10 data=1;
#10 data=0;
end
//测试的模块。例化
sequence_detect dut(
.clk(clk),
.rst_n(rst_n),
.data(data),
.data_valid(data_valid),
.match(match)
);
endmodule
最后的波形
今天是国庆假期,假期愉快。祝愿我们的祖国生日快乐!繁荣昌盛!
--晓凡 2022年10月2日于桂林书