【S013】do文件、$test$plusargs、random、$readmemh、task、function

目录

do文件

tb

输出

random

$readmemh

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可以链接这些库。


加快仿真的办法:

  1.  `timescale 1ns/1ns修改
  2. vlog -incr 增量编译
  3.  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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

qq_1615549892

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值