书接上回:
第20章 系统函数和系统任务
20.1 概述
本章描述系统函数和系统任务
20.2 仿真控制系统任务
有:$finish $stop $exit
任务原型:
$stop会让仿真suspend;
$finish会退出;
$exit要结合program程序块使用,它会先等所有的program进程结束然后调用$finish结束退出。
$stop和$finish可以输入参数n,n的值可以是0/1/2这三种,这三个的含义是:
0:退出时不打印任何东西
1:退出时会打印仿真时间和location
2:退出时会打印仿真时间、location、内存使用情况、CPU时间
20.3仿真时间系统函数
有:
20.3.1 $time
返回当前仿真时间,是一个64bit的整数值,数值单位是当前模块的时间单位。
举例:
最终打印:
解释:当前这个模块的时间精度是保持小数点后一位,所以两个#p会变成:#1.6,所以在仿真时间的第16ns和第32ns set的值分别是0和1,但是$time的数值单位是当前的时间单位,也就是10ns,本来应该打印1.6和3.2,但又因为$time返回的是整数值,所以会答应2和3。
20.3.2 $stime
返回当前仿真时间,是一个32bit的无符号整数,数值单位是当前模块的时间单位。如果仿真时间数值超过了32bit,那么只会取低32bit。
20.3.3 $realtime
返回当前仿真时间,是一个real数值,数值单位是当前模块的时间单位。
还是上面的例子,最终会打印出:
20.4 timescale系统任务
本小节介绍的系统任务可以打印timescale或者设置timescale
20.4.1 $printtimescale
原型:
作用:打印timescale
当没有参数时,打印当前module的timescale,有参数时,打印指定module的timescale。打印的格式如下:
举例:
打印:
20.4.2 $timeformat
原型:
这个任务最终控制的是$display/$write/$strobe/$monitor/$fdisplay/$fwrite /$fstrobe/$fmonitor这些系统函数在打印时间时%t对应的时间格式。
Unitis_number可以输入0到-15,对应不同的时间单位,如下表:
$timeformat默认的参数值为:
举例:
打印:
20.5转换函数
本小节提供的转换函数实现了:和real值、有符号值、无符号值之间的转换。
原型:
本小节的转换函数可以在常量表达式(11.2.1)中使用。
(1)$rtoi
功能:以截断的方式将小数转化为整数。
使用:
(2)$itor
功能:将整数转化为小数
使用:
(3)$bitstoreal
作用:64bit的计算机存储整数转换为双精度浮点数。
(4)$realtobits
作用:浮点数转换为64bit的计算机存储整数。
(5)$bitstoshortreal
作用:32bit的计算机存储整数转换为单精度浮点数。
(6)$shortrealtobits
作用:浮点数转换为32bit的计算机存储整数。
(7)$signed
功能:强制转化为有符号数
使用:
(8)$unsigned
功能:强制转化为无符号数
使用:
(9)$cast
$cast是动态转化函数,详见6.24.2和8.14
20.6 数据查询函数
(1)$typename
功能:返回字符串,指示输入参数的类型。
使用:
(2)$bits
功能:返回输入表达式或者数据的bit数量
使用:
(3)$isunbounded
功能:如果输入参数是$,返回1,否则,返回0.
使用:
标准上给出的示例是:
但是用vcs跑会出现stack overflow:
20.7 Array query functions
(1)$unpacked_dimensions
功能:返回数组的unpacked维度
使用:
(2)$dimensions
功能:返回数组的总维度数
使用:
(3)$left
功能:返回维度的左边界
使用:
(4)$right
功能:返回维度的右边界
使用:
(5)$increment
功能:如果$left>=$right,那么返回1,否则,返回-1
使用:
(6)$low
功能:当$increment返回-1时,$low返回和$left同样的值;当$increment返回1时,$low返回和$rignt同样的值。
使用:
(7)$high
功能:当$increment返回1时,$high返回和$left同样的值;当$increment返回-1时,$high返回和$rignt同样的值。
使用:
(8)$size
功能:返回$high-$low+1
使用:
20.8数学函数
20.8.1整数数学函数
(1)$clog2
功能:计算以2为底的无符号整数的对数(结果会做ceiling取整)
使用:$clog2(N)
计算结果为整数,会向上取整(重要应用:可以用来求给定大小内存所需的最小地址宽度)
注意事项:
N若不是整数,会报错,如下:
N等于0时,强制计算结果为0
N小于0时,不会报错,但是强制结果为32(?)
20.8.2实数数学函数
(1)$ln
功能:计算以e为底的实数的对数
使用:$ln(x)
注意事项:
x需大于0。小于或等于0都会报错,如下:
(2)$log10
功能:计算以10为底的实数的对数
使用:$log10(x)
注意事项:
x需大于0。小于或等于0都会报错,如下:
(3)$exp(x)
功能:计算e的x次方
使用:$exp(x)
(4)$sqrt(x)
功能:计算实数x的开方
使用:$sqrt(x)
注意事项:
x需大于0。小于或等于0都会报错,如下:
(5)$pow(x,y)
功能:计算x的y次幂
使用:$pow(x,y)
注意事项:
当x小于0时,y必须是整数值,否则会报错:
(6)$floor(x)
功能:对实数x向下取整
使用:$floor(x)
(7)$ceil(x)
功能:对实数x向上取整
使用:$ceil(x)
(8)$sin(x)
功能:求实数x的正弦,即实数x的对边/斜边的值
使用:$sin(x)
(9)$cos(x)
功能:求实数x的余弦,即实数x的邻边/斜边的值
使用:$cos(x)
(10)$tan(x)
功能:求实数x的正切,即实数x的对边/邻边的值
使用:$tan(x)
(11)$asin(x)
功能:求实数x的反正弦函数,即若siny=x,则arcsin x=y
使用:$asin(x)
注意事项:
x需大于等于-1且小于等于1,否则会报错,如下:
(12)$acos(x)
功能:求实数x的反余弦函数,即若cosy=x,则arccos x=y
使用:$acos(x)
注意事项:
x需大于等于-1且小于等于1,否则会报错,如下:
(13)$atan(x)
功能:求实数x的反正切函数,即若tany=x,则arctan x=y
使用:$atan(x)
(14)$atan2(x,y)
功能:求实数x与实数y商的反正切函数,即求arctan(x/y)
使用:$atan2(y,x)
(15)$hypot(x,y)
功能:求实数x的平方与实数y的平方的和的开方,即求x2+y2
使用:$hypot(x,y)
(16)$sinh(x)
功能:求实数x的双曲正弦函数,即求sinh(x)=ex-e-x2
使用:$sinh(x)
(17)$cosh(x)
功能:求实数x的双曲余弦函数,即cosh(x)=ex+e-x2
使用:$cosh(x)
(18)$tanh(x)
功能:求实数x的双曲正切函数,即tanhx=ex-e-xex+e-x
使用:$tanh(x)
(19)$asinh(x)
功能:求实数x的反双曲正弦函数,即若x=sinh(y)=ey-e-y2,那么y=arcsinh (x)=ln(x+x2+1
)
使用:$asinh(x)
(20)$acosh(x)
功能:求实数x的反双曲余弦函数,即若x=cosh(y)=ey+e-y2,那么y=arccosh (x)=ln(x+x2-1
)
使用:$acosh(x)
注意事项:
x需大于等于1,否则会报错,如下:
(21)$atanh(x)
功能:求实数x的反双曲正切函数,即若x=tanh(y)=ey-e-yey+e-y,那么y=arctanh (x)=12ln1+x1-x
使用:$atanh(x)
注意事项:
x需大于等于-1且小于等于1,否则会报错,如下:
20.9 bit向量系统函数
(1)$countbits
使用:$countbits(expression, list_of_control_bits)
【expression】:被统计的表达式,可用变量表示
【list_of_control_bits】:统计目标(单bit特定值,多bit时会取LSB)的集合,可用变量表示
【返回值类型】:int
例如:
$countbits(expression, ‘0):计算表达式中bit位为0的位数
$countbits(expression, ‘1):计算表达式中bit位为1的位数
$countbits(expression, ‘x):计算表达式中bit位为x的位数
$countbits(expression, ‘z):计算表达式中bit位为z的位数
$countbits(expression, ‘1, ‘z):计算表达式中bit位为1或z的位数
(2)$countones
功能:统计表达式中bit位值为1的位数。等同于$countbits(expression, ‘1)
使用:$countones(expression)
【expression】:被统计的表达式,可用变量表示
【返回值类型】:int
(3)$onehot
功能:统计表达式中bit位值为1的位数,若数量等于1,返回1’b1,否则返回1’b0
使用:$onehot(expression)
【expression】:被统计的表达式,可用变量表示
【返回值类型】:bit
(4)$onehot0
功能:统计表达式中bit位值为1的位数,若数量小于等于1,返回1’b1,否则返回1’b0
使用:$onehot0(expression)
【expression】:被统计的表达式,可用变量表示
【返回值类型】:bit
(5)$isunknown
功能:统计表达式中bit位值为x或z的位数,若数量!=0,返回1’b1,否则返回1’b0
使用:$isunknown(expression)
【expression】:被统计的表达式,可用变量表示
【返回值类型】:bit
20.10 severity函数/20.11 elaboration系统函数
(1)$fatal
功能:生成run-time 致命错误,结束simulation(隐式调用$finish)
使用:$fatal[(finish_number[, list_of_arguments])]
【finish_number】:finish的数量,一般为0|1|2
【list_of_arguments】:格式化字符串或常量表达式
(2)$error
功能:生成run-time error,不会结束simulation
使用:$error[([list_of_arguments])]
【list_of_arguments】:格式化字符串或常量表达式
(3)$warning
功能:生成run-time warning,不会结束simulation
使用:$warning[([list_of_arguments])]
【list_of_arguments】:格式化字符串或常量表达式
(4)$info
功能:生成message
使用:$info[([list_of_arguments])]
【list_of_arguments】:格式化字符串或常量表达式
20.12断言控制系统函数
(1)$assertcontrol
功能:控制assertions的评估
使用:
$assertcontrol(control_type[,[assertion_type][,[directive_type][,[levels][,[list_of_scopes_or_assertions]]]]);
【control_type】:整数表达式,用于控制该系统函数的效果,不同整数值作用不同,见下表:
-Lock:锁定所有指定assertions/expect statements/violation reports,防止状态发生改变,直到control_type设置为Unlock。
-Unlock:解除所有指定assertions/expect statements/violation reports的lock状态。
-On:启动所有指定assertions /violation reports执行,但对expect statements不会产生影响
-Off:停止所有指定assertions的检查直到control_type设置为On,不会启动一个新的attempts,但是如果assertions以及它的pass/fail statement正在执行,则不会对其产生影响。如果是deferred assertions,那么当前正在排队的reports将不会刷新且仍旧mature直到control_type设置为On。如果是已经挂起的procedural assertions,当前的队列实例将不会刷新且仍旧mature,并且不会有新的实例进入到队列中直到control_type设置为On。对于所有指定的violation reports,也会被disable掉。当前队列中的violation report不会被刷新且仍旧mature,不会添加信的violation report直到control_type设置为On。对expect statements不会产生影响。
-Kill:终止当前正在执行的特定assertions并停止检查直到control_type设置为On。但是正在排队挂起的deferred assertions的reports或已经挂起但未matured procedural assertions的reports会被刷新。也能终止所有指定violation reports。当前正在排队的violation reports但还未matured会被刷新,不会添加新的violation reports到挂起的violation reports队列中直到control_type设置为On。对expect statements不会产生影响。
-PassOn:enable所有指定断言和expect statements的vacuous和nonvacuous success的pass操作。已经正在执行的断言(包括执行成功或失败)不会受到影响。对violation report types不会产生影响。对assertions的静态计数不会产生影响。
-PassOff:终止所有指定的assertions和expect statements的vacuous/nonvacuous success的pass行为,可以通过设置control_type为PassOn来重新enable,当只有nonvacuous success的pass执行操作时,也可以通过设置control_type为NonvacuousOn来重新enable。如果assertion已经正在执行,包括pass/fail行为的执行,则不会对其产生影响。默认情况下,会执行pass行为。对violation report types不会产生影响。对assertions的静态计数不会产生影响。
-FailOn:enbale所有指定assertions和expect statements的fail执行操作。如果assertions已经正在执行,包括pass/fail行为的执行,则不会对其产生影响。会对默认的fail action block的执行产生影响。对violation report types不会产生影响。对assertions的静态计数不会产生影响。
-FailOff:终止所有指定assertions和expect statements的fail执行操作,直到设置control_type为FailOn。如果assertions已经正在执行,包括pass/fail行为的执行,则不会对其产生影响。默认情况下,会执行fail行为。会对默认的fail action block的执行产生影响。对violation report types不会产生影响。对assertions的静态计数不会产生影响。
-NonvacuousOn:enable所有指定正在nonvacuous success 的assertions和expect statements的pass执行操作。如果assertions已经正在执行,包括pass/fail行为的执行,则不会对其产生影响。vacuous success的定义参见16.14.8小节。对violation report types不会产生影响。对assertions的静态计数不会产生影响。
-VacuousOff:终止所有指定正在vacuous success 的assertions和expect statements的pass执行操作直到设置control_type为PassOn。如果assertions已经正在执行,包括pass/fail行为的执行,则不会对其产生影响。对violation report types不会产生影响。对assertions的静态计数不会产生影响。
【assertion_type】:整数表达式,用于选择该系统函数的断言类型和冲突报告类型,可以同时选择多个assertion_type,用|符号连接(例如数字3表示Concurrent|Simple Immediate)。若没有指定assertion_type,默认为255,即会应用所有的类型。不同整数值作用不同,见下表:
【directive_type】:整数表达式,用于选择该系统函数的directive类型,可以同时选择多个directive_type,用|符号连接(例如数字3表示Assert|Cover)。若没有指定directive_type,默认为7,即会应用所有的类型。不同整数值作用不同,见下表:
【levels】:整数表达式,用于选择hierarchy的level,和$dumpvars的参数一致,具体含义参见21.7.1.2,默认为0。
【list_of_scopes_or_assertions】:断言表达式
(2)$asserton
功能:$asserton[(levels[,list])]等同于$assertcontrol(3,15,7,levels[,list])
使用:$asserton[(levels[,list])]
(3)$assertoff
功能:$assertoff[(levels[,list])]等同于$assertcontrol(4,15,7,levels[,list])
使用:$assertoff[(levels[,list])]
(4)$assertkill
功能:$assertkill[(levels[,list])]等同于$assertcontrol(5,15,7,levels[,list])
使用:$assertkill[(levels[,list])]
(5)$assertpasson
功能:$assertpasson[(levels[,list])]等同于$assertcontrol(6,31,7,levels[,list])
使用:$assertpasson[(levels[,list])]
(6)$assertpassoff
功能:$assertpassoff[(levels[,list])]等同于$assertcontrol(7,31,7,levels[,list])
使用:$assertpassoff[(levels[,list])]
(7)$assertfailon
功能:$assertfailon[(levels[,list])]等同于$assertcontrol(8,31,7,levels[,list])
作用:$assertfailon[(levels[,list])]
(8)$assertfailoff
功能:$assertfailoff[(levels[,list])]等同于$assertcontrol(9,31,7,levels[,list])
作用:$assertfailoff[(levels[,list])]
(9)$assertnonvacuouson
功能:$assertnonvacuouson [(levels[,list])]等同于$assertcontrol(10,31,7,levels[,list])
作用:$assertnonvacuouson [(levels[,list])]
(10)$assertvacuousoff
功能:$assertvacuousoff [(levels[,list])]等同于$assertcontrol(11,31,7,levels[,list])
作用:$assertvacuousoff [(levels[,list])]
20.13采样值系统函数
(1)$sampled
功能:获取采样值
使用:$sampled(expression)
(2)$rose
功能:当表达式的LSB变为1时返回true(1’b1),否则返回false(1’b0)
使用:$rose(expression)
(3)$fell
功能:当表达式的LSB变为0时返回true(1’b1),否则返回false(1’b0)
使用:$fell(expression)
(4)$stable
功能:当表达式的值没有发生变化时返回true(1’b1),否则返回false(1’b0)
使用:$stable(expression)
(5)$changed
功能:当表达式的值发生了变化时返回true(1’b1),否则返回false(1’b0)
使用:$changed(expression)
$past_gclk、$fell_gclk、$changed_gclk、$rising_gclk、$steady_gclk、$past、$rose_gclk、$stable_gclk、$future_gclk、$falling_gclk、$changing_gclk具体见16.9.4小节。
20.14 coverage系统函数
Sv提供了获取coverage信息的系统函数:$coverage_control/$coverage_get_max/ $coverage_get/$coverage_merge/$coverage_save,具体见40.3.2小节
Sv提供了对coverage数据进行管理和报告的系统函数:$set_coverage_db_name/ $load_coverage_db/$get_coverage,具体见19.9小节介绍。
20.15 随机分布函数
20.15.1 $random
原型:
返回一个有符号32bit整数随机值,且每次调用都会刷新。
重要应用:
(1)$random%b:会产生一个[(-b+1):(b-1)]之间的随机值,举例:
会产生-59到59之间的随机值
(2){$random}%b:会产生一个[0:(b-1)]之间的随机值,举例:
会产生0到59之间的随机值
20.15.2 分布函数
原型:
Mean/degree_of_freedom/k_stage这几个参数必须大于0。
$dist_uniform:均匀分布
$dist_normal:正态分布
$dist_exponential:指数分布
$dist_possion:泊松分布
$dist_chi_square:卡方分布
$dist_t:t分布
$dist_erlang:erlang分布
均匀分布的start必须小于end
Mean参数:能够控制函数的返回值和这个值接近。
Standard_deviation和degree_of_freedom参数用来确定密度函数的形状。
20.16随机分析任务和函数
原型:
20.16.1 $q_initialize
作用:创建新的队列。Q_id是一个整数值,作为这个队列唯一性的标识。Q_type也是一个整数值,不同的数值创建的队列不一样,如下:
Max_length是整数值,指定队列的大小。
Status表示队列创建的状态。
20.16.2 $q_add
给队列的指定位置替换一个entry。
20.16.3 $q_remove
从队列接收一个entry。
20.16.4 $q_full
检查队列是否还有空间,有返回0,无返回1。
20.16.5 $q_exam
获取队列的信息。
20.16.6 状态数值
上面所有有关队列的操作的状态数值对应的含义如下:
20.17 PLA模型系统任务
PLA指的是可编程逻辑队列:programmable logic array。
包含了:
具体格式:
20.17.1 array types
Array types只有两种:同步和异步。
举例:
20.17.2 array logic types
rray logic types只有四种:and/or/nand/nor
举例:
20.18 其他
20.18.1 $system
原型:
这个系统函数最终会调用c语言的system()函数。
作用是执行输入指令。
举例:
因此,该调语句执行完后会将design.v名字改成 adder.v