System verilog 选择什么环境体系结构来验证多接口模块

System verilog 选择什么环境体系结构来验证多接口模块,system-verilog,uvm,System Verilog,Uvm,我将测试以axi4流和apb接口作为输入,以axi4接口作为输出的复杂模块。 据我所知,我应该营造这样的环境: |----------------------------------------------- | |

我将测试以axi4流和apb接口作为输入,以axi4接口作为输出的复杂模块。
据我所知,我应该营造这样的环境:

                                      |-----------------------------------------------
                                      |                                              |
                             _________|_________           _______________     ______v______
                            |                   |         |               |    |            |
                            |   APB-monitor     |         | AXI4-monitor  |--->|            |
                            |___________________|         |_______________|    |            |
                                       |                          |            |            |
 ____________        ______________    |     _________            |            |            |
|            |      |              |   |    |         |           |            |            |
| APB-seqr   |----->| APB-master   |---*--->|         |           |            |            |
|____________|      |______________|        |         |           |            |            |
                                            |   DUT   |           |            |            |
 ____________        ______________         |         |-----------*----------->| Scoreboard |
|            |      |              |        |         |                        |            |
|AXI4-S-seqr |----->|AXI4-S-master |---*--->|         |                        |            |
|____________|      |______________|   |    |_________|                        |            |
                                       |                                       |            |
                                       |                                       |            |
                             --------------------                              |            |
                            |                    |                             |            |
                            |   AXI4-S-monitor   |---------------------------->|            |
                            |____________________|                             |____________|
对吗?如果是这样,我应该如何将事务从监视器发送到记分板?我想我应该使用analysis\u port/imp pair,但我不能在scoreboard类中重载
write
方法,所以据我所知,我不能在一个类中使用三个分析端口。
有人能给我举一个如此复杂设计的uvm例子吗?
目前,我在尝试使用分析端口时遇到此类错误:

#    Time: 0 ps  Iteration: 0  Region: /uvm_pkg::uvm_analysis_imp #(axi4_s_pkg::axi4_s_seq_item, ecaa_pkg::ecaa_scoreboard) File: D:/questasim64_10.4c/win64/../verilog_src/uvm-1.1d/src/uvm_pkg.sv
# ** Error: (vsim-8754) D:/questasim64_10.4c/win64/../verilog_src/uvm-1.1d/src/tlm1/uvm_analysis_port.svh(114): Actual input arg. of type 'class work.axi4_s_pkg::axi4_s_seq_item' for formal 'trans' of 'write' is not compatible with the formal's type 'class work.apb_pkg::apb_seq_item #(3, 2, 32, 32, 4)'.```

这里有两种解决问题的方法

1。简单的方法(使用“uvm分析”imp decl宏)

对于每个输入,只需在组件类之外调用宏即可。宏声明了一种特殊的分析imp。传递给宏的参数用作imp类型名称和写入方法名称中的后缀。然后,为每个输入实例化一个imp,并为每个输入定义一个方法。例如:

`uvm_analysis_imp_decl(_AXI4_S)
`uvm_analysis_imp_decl(_AXI4)
`uvm_analysis_imp_decl(_APB)

class scoreboard extends uvm_scoreboard;

  uvm_analysis_imp_AXI4_S #(AXI4_S_xact, scoreboard) AXI4_S_export;
  uvm_analysis_imp_AXI4   #(AXI4_xact,   scoreboard) AXI4_S_export;
  uvm_analysis_imp_APB    #(APB_xact,    scoreboard) APB_export;
  ...
  function void build_phase(uvm_phase phase);
    AXI4_S_export = new("AXI4_S_export", this);
    AXI4_export   = new("AXI4_export",   this);
    APB_export    = new("APB_export",    this);
  endfunction
  ...
  function void write_AXI4_S(AXI4_S_xact t);
    ...
  endfunction

  function void write_AXI4(AXI4_xact t);
    ...
  endfunction

  function void write_APB(APB_xact t);
    ...
  endfunction
  ...
2。艰难之路(嵌入式用户)


在记分板中实例化三个订阅者。每个都是一个单独的作用域,因此每个都可以有自己的
写入方法。

这里有两种解决问题的方法

1。简单的方法(使用“uvm分析”imp decl宏)

对于每个输入,只需在组件类之外调用宏即可。宏声明了一种特殊的分析imp。传递给宏的参数用作imp类型名称和写入方法名称中的后缀。然后,为每个输入实例化一个imp,并为每个输入定义一个方法。例如:

`uvm_analysis_imp_decl(_AXI4_S)
`uvm_analysis_imp_decl(_AXI4)
`uvm_analysis_imp_decl(_APB)

class scoreboard extends uvm_scoreboard;

  uvm_analysis_imp_AXI4_S #(AXI4_S_xact, scoreboard) AXI4_S_export;
  uvm_analysis_imp_AXI4   #(AXI4_xact,   scoreboard) AXI4_S_export;
  uvm_analysis_imp_APB    #(APB_xact,    scoreboard) APB_export;
  ...
  function void build_phase(uvm_phase phase);
    AXI4_S_export = new("AXI4_S_export", this);
    AXI4_export   = new("AXI4_export",   this);
    APB_export    = new("APB_export",    this);
  endfunction
  ...
  function void write_AXI4_S(AXI4_S_xact t);
    ...
  endfunction

  function void write_AXI4(AXI4_xact t);
    ...
  endfunction

  function void write_APB(APB_xact t);
    ...
  endfunction
  ...
2。艰难之路(嵌入式用户)


在记分板中实例化三个订阅者。每个都是一个单独的作用域,因此每个都可以有自己的
write
方法。

谢谢您的回答!实际上,我考虑了第二种方式,我在测试环境中为单接口模块提供了订户。重用它们会很好,但它们有这样的写入方法:
函数void write(axi4_s_seq_item t);axi4_s_记分板axi4_s_sb$演员(axi4_s_sb,m_家长);axi4_s_sb.write(t);用于axi4_s接口的endfunction
。由于同样的原因,我不能使用它们,而且我不确定为新的接口组合编写新的订户是否是一种好的做法。谢谢您的回答!实际上,我考虑了第二种方式,我在测试环境中为单接口模块提供了订户。重用它们会很好,但它们有这样的写入方法:
函数void write(axi4_s_seq_item t);axi4_s_记分板axi4_s_sb$演员(axi4_s_sb,m_家长);axi4_s_sb.write(t);用于axi4_s接口的endfunction
。出于同样的原因,我不能使用它们,而且我不确定为新的接口组合编写新的订户是否是一种好的做法。