You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 00:50:20