我是靠谱客的博主 激情美女,最近开发中收集的这篇文章主要介绍数电和Verilog-系统函数,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

A.7 系统函数

同样只给大家讲相对比较常用的几个系统函数,对于后续课程内容的学习甚至实际工作的绝大部分场景来说已经足够了。

$ display和$write

将信息打印到屏幕。

`timescale 10ns/1ns
int a = 'd10;
string s = "hello";
$display("%t -> %s ,here a is %0d",$time,s,a);
#10ns;
$display("%t -> %s ,here a is %0h",$time,s,a);
#1ns;
$display("%t -> %s ,here a is %0b",$time,s,a);
#10ns;
$display("%t -> %s ,here a is %b",$time,s,a);
$display("%t -> %s ,n here a is %b",$time,s,a);
$display("%t -> %s ,t here a is %b",$realtime,s,a);
//打印输出的结果:
0 -> hello ,here a is 10
10 -> hello ,here a is a
10 -> hello ,here a is 1010
20 -> hello ,here a is 00000000000000000000000000001010
20 -> hello ,
here a is 00000000000000000000000000001010
21 -> hello ,
here a is 00000000000000000000000000001010

注意:

(1)这里的%前缀表示要打印的格式。

(2)通常为了避免打印的数字过长,我们会在%后加0来略去前面为0的数值。比如这里的int类型位宽是32个bit,因此如果直接%b而不是%0b的话,前面就会打印过多的0,看起来也不够方便。

(3)#数字,表示延时一个仿真时间单位。

(4)$time表示当前仿真时间,会受到时间单位(这里是通过`timescale设置了时间单位是10ns,时间精度是1ns)的影响,即必须是时间单位的整数倍,而$realtime则不受此影响,即会把时间精度也打印出来。

(5)n表示换行符,t表示tab的制表符。

$random

返回一个32 位的有符号整型随机数,可以配合取余运算符%来产生需要范围的随机数。

比如下面这行代码返回一个-9~9之间的随机数。

$display("random number is %0d",$random % 10);

$finish

用于结束仿真。

initial begin
语句;
...
语句;
$finish();
end

$readmemb和$readmemh

假设有这样的数据文件:

//mem.data
00 11 22 33 44 55 66 77 88 99 aa bb cc dd ee ff
00 11 22 33 44 55 66 77 88 99 aa bb cc dd ee ff
00 11 22 33 44 55 66 77 88 99 aa bb cc dd ee ff
00 11 22 33 44 55 66 77 88 99 aa bb cc dd ee ff

那么我们可以使用系统函数$readmemh将其读到用于表示存储的一个二维变量中,即下面的mem。

//定义数据位宽为8,深度为64的存储空间
reg[7:0] mem[0:63];
//在仿真时刻为0时,将装载数据到以地址是0的存贮器单元为起始存放单元的存贮器中去。
initial $readmemh("mem.data",mem);
//将装载数据到以单元地址是32的存贮器单元为起始存放单元的存贮器中去,一直到地址是63的单元为止。
initial $readmemh("mem.data",mem,32);
//将从地址是0的单元开始装载数据,一直到地址为31的单元。
initial $readmemh("mem.data",mem,0,31);

$readmemb和$readmemh类似,只不过readmemb操作的数据文件中的每个数字必须是二进制数,而readmemh则必须是十六进制数。

$fopen,$fclose,$fdisplay和$fwrite

用于文件的输入和输出。

`timescale 10ns/1ns
integer file_h;
string s = "hello";
int a = 1;
file_h = $fopen("file.txt");
$fdisplay(file_h,"%t -> %s ,here a is %0d",$realtime,s,a);
#1ns;
$fdisplay(file_h,"%t -> %s ,here a+1 is %0d",$realtime,s,a+1);
#1ns;
$fdisplay(file_h,"%t -> %s ,here a+2 is %0d",$realtime,s,a+2);
$fclose(file_h);

打开文件file.txt,查看其内容为:

0 -> hello ,here a is 1
1 -> hello ,here a+1 is 2
2 -> hello ,here a+2 is 3

可以看到,我们已经将内容写入了文件。

这里的$fwrite与$fdisplay都是将格式化内容写入到文件,只是$fdisplay写入后会自动换行,而$fwrite则不会。

$test$plusargs和$value$plusargs

可以在无需重新编译的情况下,通过系统函数$test$plusargs和$value$plusargs传入仿真运行参数来改变代码中的逻辑,这个非常有用。

$test$plusargs用于传递开关参数,使用示例:

//在代码中加入
if($test$plusargs("YOUR_RUNSIM_ARGS"))begin
语句;
end
else begin
语句;
end
//在仿真脚本中加入
+YOUR_RUNSIM_ARGS

$value$plusargs用于传递值参数,使用示例:

//在代码中加入
int YOUR_RUNSIM_ARGS_VALUE;
if($value$plusargs("YOUR_RUNSIM_ARGS_VALUE = %0d",YOUR_RUNSIM_ARGS_VALUE))begin
语句;
end
else begin
语句;
end
//在仿真脚本中加入
+YOUR_RUNSIM_ARGS_VALUE=100
//这样在仿真时就会将值100传递给定义的变量YOUR_RUNSIM_ARGS_VALUE

小结

当然还有不少其他的系统函数,不过一般情况下都用不到,原因要么是因为你真的用不到,要么是有其他更好用更方便的替代方法,所以暂时知道有这些系统函数就够了。

随便举个例子,比如用于监控的$monitor很容易被verdi或dve这种波形调试工具所取代。

公众号:程序员Marshall

最后

以上就是激情美女为你收集整理的数电和Verilog-系统函数的全部内容,希望文章能够帮你解决数电和Verilog-系统函数所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(31)

评论列表共有 0 条评论

立即
投稿
返回
顶部