目录
do文件
.main clear
quit -sim
cd D:/gaop/SIM/sim_test
vlib work
vmap work work
vlog -novopt -incr -sv -work work "./tb/tb.v"
vsim +parameter1 +parameter2=pcie -novopt -t 1ns -L work work.tb
log -r /*
# do wave.do
run 1us
#
vlog +incdir+./define +acc=anpr -work work ./tb/*.v
glbl特殊:
vsim -l sim.log -L ./pango_lib work.glbl wirk.tb
+incdir+./define :包含头文件
+acc=anpr:允许参看声明(a)/网络(n)/端口(p)/寄存器(r)
//解释
#切换到工作目录
cd D:/gaop/modeltech64_2019.2/lib_test/add/lib
#创建库,当前物理目录下面创建一个add文件夹,里面有个_info文件
vlib add
# 映射库
vmap logic_add add
# vmap [-help] [-version] [-modelsimini <ini_filepath>] [-c] [-del] [<logical_name>] [<path>]
# vmap [<logical_name>] [<path>]
# 将物理路径[<path>]下面的库add映射到modelsim库logic_add 里面并取个别名[<logical_name>]
# 将文件编译进add物理库
vlog -reportprogress 300 -work add D:/gaop/modeltech64_2019.2/lib_test/add/add.v
# -work <path> Specify library WORK
#添加库并且仿真
vsim -t ns -L D:/gaop/modeltech64_2019.2/lib_test/add/lib/add work.addtb
vsim -t ns -L add_lib work.addtb
# -L <libname> 例化的模块在<libname>里面搜索
总结:
可以将若干.v文件编译进入一个库里面,后面用-L可以链接这些库。
加快仿真的办法:
- `timescale 1ns/1ns修改
- vlog -incr 增量编译
- vlog -nodebug关闭debug功能(可选,有时不好使)
https://www.cnblogs.com/hfyfpga/p/4281579.html
tb
`timescale 1ns/100ps
module tb ( );
reg clk =0,rst =1;
always clk =#5 ~clk;
reg [255:0] testname;
reg [10*8:0] str = "hello";
initial begin
$display("begin $test$plusargs");
//若检测到输入的参数里面有parameter1,则$test$plusargs("parameter1")==1
if($test$plusargs("parameter1"))
$display("detect parameter1");
else
$display("not detect parameter1 ");
//若检测到输入的参数里面有"parameter2 =xxx",则testname的内容为xxx
//参数中间不能有空格
if($value$plusargs("parameter2=%s",testname[255:0]))
$display("detect parameter2=%0s",testname);
else
$display("not detected parameter2");
//如果字符串的内容小于字符串变量的尺寸,
//%s打印字符串时前面会添加空格;
//而%0s不会添加空格(字符串顶头打印)
//显示%:%% 百分符号%
$display("display %%s %s", str);
$display("display %%0s %0s", str);
end
endmodule
输出
random
左边被赋值的变量必须是reg型
【语法结构】:
$random(seed);
【实例1】:
实例1:
reg[23:0]rand1;
rand1 = $random % 100;
//产生一个 -99 ~ 99 范围的随机数,赋值给rand
【实例2】:
reg[23:0]rand1;
rand1 = {$random} % 100;
//通过位拼接操作{}产生 0 ~ 99 范围的随机数,赋值给rand
【实例3】:
reg[23:0]rand1;
rand1 = min + {$random} % (max - min + 1);
//产生一个在min, max之间随机数的例子
initial begin
while(1) begin
@(negedge spi_clk_int);
spi_din_int = {$random} % 100;
end
end
$readmemh
(1)$readmemb("<数据文件名>",<存储器名>);
(2)$readmemb("<数据文件名>",<存储器名>,<起始地址>);
(3)$readmemb("<数据文件名>",<存储器名>,<起始地址>,<终止地址>);
(4)$readmemh("<数据文件名>",<存储器名>);
(5)$readmemh("<数据文件名>",<存储器名>,<起始地址>);
(6)$readmemh("<数据文件名>",<存储器名>,<起始地址>,<终止地址>);
`timescale 10ns/1ns
module test;
reg set;
reg[15:0] memory[0:7]; //注意这里每个存储单元的长度为16位,
reg[4:0] n;
initial
begin
$readmemh("file2.txt",memory);
for(n=0;n<=7;n=n+1)
$display("%h",memory[n]);
end
endmodule
task
注意:reg [8:0] sum ;//任务调用中接收返回数据的变量必须是寄存器类型
`timescale 1ns/100ps
module tb ( );
reg clk =0;
always clk =#5 ~clk;
reg [8:0] sum ;//任务调用中接收返回数据的变量必须是寄存器类型
reg [9:0] sumx2 ;
wire [7:0] x = 2,y = 3;
// automatic
task task_demo;//注意分号; 在第一行“task”语句中不能列出端口名称;
input clk;//输入只会采样执行那一刻的值,例如时钟无法传入。
input [7:0] x,y; //input个数无限制甚至可以没有输入 ,只能是wire型 //注意分号;
output reg[8:0] sum; //output个数无限制甚至可以没有输出,可以使wire/reg/integer //注意分号;
//内部可以用@(posedge clk);
output reg [9:0] sumx2;
fork //块之间是并行运行
begin
#10;
$display("111111");
assign sum = x+y;//可以出现延时#1
end
begin
sumx2 = #5 x + 1;
end
$display("time:%h",$time);
join
//可以调用其他函数function or task,也可以调用自身
endtask
initial begin
#20;
task_demo(clk,x,y,sum,sumx2);
$display("task_demo");
end
endmodule
控制台打印
为什么是这个顺序?想明白就会了。
波形
时钟无法传入。原因是变量的作用域,可以通过tb.clk来调用。
function
function AND;
input A, B; //定义输入变量
begin //定义函数体
AND = A && B;
end
endfunction
参考
https://blog.csdn.net/m0_38037810/article/details/79598647