首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SystemVerilog宏通过任务

SystemVerilog宏通过任务
EN

Stack Overflow用户
提问于 2022-11-30 13:19:39
回答 2查看 50关注 0票数 1

如何通过任务将宏作为参数发送?

在测试席上:

代码语言:javascript
复制
`define CPU1 tb.top.dual_processor_db_wrapper_i.dual_processor_db_i.cpu1.inst
`define CPU2 tb.top.dual_processor2_db_wrapper_i.dual_processor2_db_i.cpu2.inst

initial begin
    fork
        cpu_init(`CPU1);
        cpu_init(`CPU2);
    join
    // Other stuff with `CPU1 and `CPU2
    
    `CPU1.write_data(addr, 4, data, resp); // Works
end

task cpu_init(cpu);
    cpu.por_srstb_reset(1'b1); // Does not work
    // Other init stuff
endtask

编译时出错:

错误: VRFC 10-2991 'por_srstb_reset‘未在前缀'cpu’下声明。

“The”的类型(对我来说)是未知的。也许Xilinx有一种类型,因为它引用了他们的MPSoC VIP?

我认为por_srstb_resetwrite_data是Xilinx MPSoC VIP的任务或函数,但我不确定。

Xilinx文档非常稀少。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-11-30 13:52:01

一般情况下,可以将宏作为参数传递给task。但是,不可能将分层引用作为参数传递给task (这是非法的)。

一般说来,对分层引用的操作非常有限。

您的task声明相当于以下内容:

代码语言:javascript
复制
task cpu_init (input logic cpu);

cpu变量是1位类型.因此,以下是合法的:

代码语言:javascript
复制
`define CPU1 1'b1
cpu_init(`CPU1);

参数的类型必须在声明和任务调用之间匹配。

票数 1
EN

Stack Overflow用户

发布于 2022-11-30 20:40:51

解决这个问题的另一种方法是使用bind和抽象/具体类。

代码语言:javascript
复制
package pkg;
  interface class abstract_init;
    pure virtual task init; // prototype for each method you need
  endclass
  abstract_init lookup[string]; // database of concrete classes for each instance
endpackage

module bind_module #(string lookup_name);
  import pkg::*;
  class concrete_init implements abstract_init;
    function new;
      lookup[lookup_name] = this; // register this instance 
    endfunction
    virtual task init;
      processor.reset(); // upwards reference
    endtask
  endclass
  concrete_init c = new; // each instance of this module gets registered in lookup
endmodule
    


`define cpu1 top.dut.cpu1
`define cpu2 top.dut.cpu2
// macro turns any argument into a quoted string
`define Q(arg) `"arg`"
    
module top;
  dut dut();
  bind `cpu1 bind_module #(.lookup_name(`Q(`cpu1))) b();
  bind `cpu2 bind_module #(.lookup_name(`Q(`cpu2))) b();
  initial fork
    pkg::lookup[`Q(`cpu1)].init;
    pkg::lookup[`Q(`cpu2)].init;
  join

endmodule

module dut;
  processor cpu1();
  processor cpu2();
endmodule

module processor;
  initial $display("Starting %m");
  task reset;
    #1 $display("executing reset on %m");
  endtask
endmodule

这一点在我的DVCon论文:缺少的链接:到DUT连接的Testbench中有更详细的描述。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74628479

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档