Verilog 语言中的**系统任务(System Tasks)与系统函数(System Functions)**是调试与建模中非常关键的组成部分,它们以 $
开头,由仿真器实现,不能综合,但在仿真和验证过程中扮演重要角色。
一、系统任务 vs 系统函数
特征 | 系统任务(System Tasks) | 系统函数(System Functions) |
---|
调用方式 | 类似过程调用($display(...) ) | 像函数调用(x = $clog2(y) ) |
是否返回值 | 无返回值 | 有返回值 |
是否可综合 | 一般不可综合,仅用于仿真 | 一般不可综合(少数例外) |
使用目的 | 打印、读写文件、时间控制等 | 计算表达式、获取值 |
二、系统任务(System Tasks)详解
1. 仿真输出类任务
$display
, $monitor
, $write
, $strobe
系统任务 | 功能 | 示例 |
---|
$display | 一次性格式化输出一行,换行 | $display("A=%0d", A); |
$write | 类似 $display 但不换行 | $write("Processing"); |
$strobe | 在当前时间步骤最后执行输出 | $strobe("At end: %b", data); |
$monitor | 自动追踪变化,一次性启动,多次触发 | $monitor("A=%b B=%b", A, B); |
✅ 推荐用法:$display
更适合调试数据变化;$monitor
更适合追踪信号变化。
2. 文件操作
系统任务 | 功能 | 示例 |
---|
$fopen , $fclose | 打开/关闭文件 | fd = $fopen("log.txt"); |
$fdisplay , $fwrite | 写入文件内容 | $fdisplay(fd, "Result=%d", res); |
$readmemh , $readmemb | 从文件初始化 memory(ROM/内存) | $readmemh("mem.txt", mem_array); |
✅ 通常在测试平台中读取初始化数据(ROM,寄存器文件)。
3. 时间控制与仿真管理
系统任务 | 功能 | 示例 |
---|
$finish | 停止仿真,退出 | $finish; |
$stop | 暂停仿真(等待用户手动继续) | $stop; |
$time | 返回当前仿真时间(无单位) | $display("Time=%0t", $time); |
$realtime | 返回浮点数形式的时间(有单位) | $display("Time=%f", $realtime); |
$timeformat | 设置仿真时间显示格式 | $timeformat(-9, 2, " ns", 20); |
三、系统函数(System Functions)详解
1. 数学与逻辑函数
系统函数 | 功能 | 示例 |
---|
$clog2(x) | 返回 log₂(x) 的上整(ceil)值 | $clog2(17) → 5 |
$signed(x) | 将无符号数转为有符号数 | y = $signed(8'b10000000); |
$unsigned(x) | 将有符号数转为无符号数 | y = $unsigned(-1); |
$bits(x) | 返回变量所占位宽 | $bits(data[7:0]) → 8 |
$random | 返回伪随机数 | x = $random(seed); |
2. 字符串操作函数
系统函数 | 功能 | 示例 |
---|
$sformat | 格式化为字符串 | $sformat(str, "val=%0d", x); |
$sscanf | 从字符串中提取数据 | $sscanf(str, "%d", val); |
$strlen , $stoi , $itor 等 | 字符串操作 | $strlen("abc") → 3 |
3. Verilog-2001 新增常用函数
系统函数 | 功能 | 示例 |
---|
$isunknown(x) | 判断是否包含 x/z 值 | if ($isunknown(data)) ... |
$countones(x) | 统计1的个数(部分工具支持) | $countones(8'b10101010) → 4 |
四、综合限制说明
绝大多数系统任务与系统函数 不可综合(non-synthesizable),只用于仿真、测试平台、调试信息输出。综合工具会忽略这些语句,因此在 RTL 代码(非 testbench)中应尽量避免使用它们,除非明确是用于 FPGA 测试的特殊用途。
五、使用场景总结
场景 | 推荐系统任务/函数 |
---|
调试波形、观察变量值 | $display , $monitor , $strobe |
仿真结束/暂停 | $finish , $stop |
初始化内存 | $readmemh , $readmemb |
生成随机数据 | $random |
字符串格式化 | $sformat , $sscanf |
时钟周期统计 | $time , $realtime |