简单的一些函数

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/sunzepeng_szp/article/details/102691538

系统任务
Verilog中还提供了很多系统任务,类似于C中的库函数,使用这些系统任务可以方便地进行测试。由于计组实验中用到的系统任务相对较少,所以在此仅对$display, $monitor, $readmemh进行介绍。

  1. d i s p l a y display 格式: display(p1,p2,…,pn);

这个系统任务的作用是用来输出信息,即将参数p2到pn按参数p1给定的格式输出。用法和C语言中的printf类似。下面用一个例子简单介绍其用法。

例如:

module disp;
reg[4:0] a;
reg[4:0] b;
initial begin
a = 10;
b = 20;
$display(“a = %d,b = %d\n”,a,b);
end
endmodule
其输出结果为:
a = 10,b = 20

其中%d是以十进制的形式输出,\n为换行符。

在此说明几种常用的输出格式:

输出格式 说明
%h或%H 以十六进制数的形式输出
%d或%D 以十进制数的形式输出
%b或%B 以二进制数的形式输出
%c或%C 以ASCII码字符的形式输出
%s或%S 以字符串的形式输出
2. $monitor
格式:
$monitor(p1,p2,…,pn);
$monitor;
$monitoron;
$monitoroff;

    任务$monitor提供了监控和输出参数列表中的表达式或变量值的功能。其参数列表中输出控制格式字符串和输出列表的规则和$display中的一样。当启动带有一个或多个参数的$monitor任务时,仿真器则建立一个处理机制,使得每当参数列表中变量或表达式的值发生变化时,整个参数列表中变量或表达式的值都将输出显示。如果同一时刻,两个或多个参数的值发生变化,则在该时刻只输出显示一次。

    $monitoron和$monitoroff任务的作用是通过打开和关闭监控标志来控制监控任务$monitor的启动和停止,这样使得程序员可以很容易地控制$monitor何时发生。其中$monitoroff任务用于关闭监控标志,停止监控任务$monitor,$monitoron则用于打开监控标志,启动$monitor监控任务。$monitor与$display的不同处还在于$monitor往往在initial块中调用,只要不调用$monitoroff,$monitor便不间断地对所设定的信号进行监视。
  1. $readmemh
    格式:
    $readmemh(“<数据文件名>”,<存储器名>);
    $readmemh(“<数据文件名>”,<存储器名>,<起始地址>);
    $readmemh(“<数据文件名>”,<存储器名>,<起始地址>,<结束地址>);

功能:
$readmemh函数会根据绝对/相对路径找到需要访问的文件,按照ascii的解码方式将文件字节流解码并读入容器。文件中的内容必须是十六进制数字0~f或是不定值x,高阻值z(字母大小写均可),不需要前导0x,不同的数用空格或换行隔开。假设存储器名为arr,起始地址为s,结束地址为d,那么文件中用空格隔开的数字会依次读入到arr[s],arr[s+1]…到arr[d]。假如数字的位数大于数组元素的位数,那么只有低位会被读入,剩下的高位会被忽略。

此系统任务用来从文件中读取数据到存储器中,类似于C语言中的fread函数。

例如:

module im;
reg[31:0] im_reg[0:2047];
initial begin
$readmemh(“code.txt”,im_reg);
end
endmodule
仿真后即可将code.txt中的内容读入im_reg存储器中。

猜你喜欢

转载自blog.csdn.net/sunzepeng_szp/article/details/102691538