SystemVerilog能否生成存储综合/仿真时间的逻辑向量?
SystemVerilog实现综合/仿真时的日期时间逻辑向量
SystemVerilog完全支持生成满足你需求的日期时间逻辑向量,核心是区分仿真阶段和综合阶段的不同实现方式:
一、仿真阶段:获取仿真执行时间
仿真时可以直接利用SystemVerilog的系统函数获取当前仿真时间或主机系统时间,再转换为逻辑向量:
1. 获取仿真运行时间
使用$time(整数时间单位)或$realtime(实数时间单位),结合时间单位定义,将数值转为逻辑向量:
module sim_time_example; timeunit 1ns; timeprecision 1ps; logic [63:0] sim_time_vec; initial begin sim_time_vec = $time; // 获取当前仿真时间(单位ns),转为64位逻辑向量 $display("Simulation time as vector: %h", sim_time_vec); end endmodule
2. 获取主机系统当前日期时间
如果需要主机的实际系统时间而非仿真时间,可以通过$system调用外部命令获取,再解析为逻辑向量:
module system_time_example; logic [127:0] sys_time_vec; string time_str; initial begin $system("date +%Y%m%d%H%M%S > time.txt"); // 将系统时间写入文件 $readmemh("time.txt", sys_time_vec); // 读取文件内容转为逻辑向量 $display("System time as vector: %h", sys_time_vec); end endmodule
二、综合阶段:获取综合初始化时间
主流FPGA综合工具(Xilinx Vivado、Intel Quartus等)支持SystemVerilog的预编译宏,这些宏在综合时会被替换为编译时刻的日期和时间:
核心预定义宏
__DATE__:字符串格式,如"Oct 12 2024"__TIME__:字符串格式,如"14:35:22"
转换为逻辑向量的实现
可以编写一个函数将日期时间字符串转为二进制逻辑向量,综合后该值会被固化为综合时刻的时间:
module synth_time_example( output logic [63:0] synth_time_vec ); // 将日期字符串转为数值(格式:YYYYMMDDHHMMSS) function automatic logic [63:0] date_time_to_vec(); string date_str = __DATE__; string time_str = __TIME__; int year, month, day, hour, minute, second; logic [63:0] result; // 解析月份字符串为数字 case(date_str.substr(0,2)) "Jan": month = 1; "Feb": month = 2; "Mar": month = 3; "Apr": month = 4; "May": month = 5; "Jun": month = 6; "Jul": month = 7; "Aug": month = 8; "Sep": month = 9; "Oct": month = 10; "Nov": month = 11; "Dec": month = 12; endcase // 解析日期、时间各字段 day = date_str.substr(4,5).atoi(); year = 2000 + date_str.substr(7,8).atoi(); // 适配20xx年份格式 hour = time_str.substr(0,1).atoi(); minute = time_str.substr(3,4).atoi(); second = time_str.substr(6,7).atoi(); // 拼接为64位逻辑向量 result = {year, month, day, hour, minute, second}; return result; endfunction // 综合时初始化逻辑向量 initial begin synth_time_vec = date_time_to_vec(); end endmodule
三、兼容仿真与综合的统一实现
可以通过条件编译指令,让代码在仿真和综合时自动切换逻辑:
module unified_time_example( output logic [63:0] time_vec ); `ifdef SIMULATION // 仿真时使用系统时间 initial begin string time_str; $system("date +%Y%m%d%H%M%S > sim_time.txt"); $readmemh("sim_time.txt", time_vec); end `else // 综合时使用预编译宏生成的时间 function automatic logic [63:0] date_time_to_vec(); string date_str = __DATE__; string time_str = __TIME__; int year, month, day, hour, minute, second; logic [63:0] result; case(date_str.substr(0,2)) "Jan": month = 1; "Feb": month = 2; "Mar": month = 3; "Apr": month = 4; "May": month = 5; "Jun": month = 6; "Jul": month = 7; "Aug": month = 8; "Sep": month = 9; "Oct": month = 10; "Nov": month = 11; "Dec": month = 12; endcase day = date_str.substr(4,5).atoi(); year = 2000 + date_str.substr(7,8).atoi(); hour = time_str.substr(0,1).atoi(); minute = time_str.substr(3,4).atoi(); second = time_str.substr(6,7).atoi(); result = {year, month, day, hour, minute, second}; return result; endfunction initial begin time_vec = date_time_to_vec(); end `endif endmodule
注意:预编译宏的支持取决于具体综合工具,使用前需确认工具文档;仿真时的外部命令调用仅在支持宿主系统交互的仿真器(如ModelSim、VCS)中有效。
内容的提问来源于stack exchange,提问作者gyuunyuu
相关产品推荐
相关产品推荐

