System verilog SystemVerilog-如何将字符串用作事件或时间?

System verilog SystemVerilog-如何将字符串用作事件或时间?,system-verilog,System Verilog,我有一笔交易,包括: string delay; string delay_type; 如果延迟类型=时间,则延迟将具有以下结构: 3ns数字和时间单位 如果延迟类型==事件,则延迟将具有以下结构: @posedge clk@信号的posedge/NEDGE 我如何在bfm中使用此功能 例如,在delay_type==time的情况下,我希望能够做到: 3ns,其中3ns是延迟字符串 在delay_type==event的情况下,我希望能够等待事件,例如等待某个信号的posedge。不能将字符

我有一笔交易,包括:

string delay;
string delay_type;
如果延迟类型=时间,则延迟将具有以下结构: 3ns数字和时间单位

如果延迟类型==事件,则延迟将具有以下结构: @posedge clk@信号的posedge/NEDGE

我如何在bfm中使用此功能

例如,在delay_type==time的情况下,我希望能够做到: 3ns,其中3ns是延迟字符串


在delay_type==event的情况下,我希望能够等待事件,例如等待某个信号的posedge。

不能将字符串直接转换为代码。相反,您将不得不解析字符串$sscanf将是您的朋友,例如:

begin : parse
  int n, time;
  string unit, edge, signal;
  if (transaction.delay_type == "time")
    begin
      n = $sscanf(transaction.delay, "%d%s", time, unit);
      assert (n == 2);
      if (unit == "ns")
        repeat(n) #1ns;
      else
      ...
    end
  else
    begin
      n = $sscanf(transaction.delay, "@(%s %s)", edge, signal);
      assert (n == 2);
      if (edge == "posedge")
        if (signal == "clk")
          @(posedge clk);
        else
          ...
      else
        if (signal == "clk")
          @(negedge clk);
        else
          ...
      ...
    end
end : parse

虽然不优雅,但希望您能理解。

您最好尝试将正在读取的事务文本文件直接转换为SystemVerilog。或者,如果事件数量有限,那么将它们编码为可以分支为case语句的内容可能是可行的

没有选项将信号粘贴到posedge/negedge?@sarr我不知道,除非您可以使用PLI/VPI执行此操作。所谓信号,我指的是vif.clk,例如vif是虚拟接口。对不起。我不明白你的意思。是否有任何选项可以将虚拟接口信号从组件传递到组件网,例如从序列/事务传递到驱动程序?