System verilog 如何从测试台访问结构

System verilog 如何从测试台访问结构,system-verilog,System Verilog,除非结构是单向的,否则将测试台和DUT端口连接在一起不会有任何困难 在您的测试台代码中,注释出结构成员的reg声明,并使用结构声明 typedef struct packed signed{ bit valid; bit tag; bit signed[31:0] data; }my_data; module structure_example5(input clk,input my_data a); always@(posedge clk) begin if

除非结构是单向的,否则将测试台和DUT端口连接在一起不会有任何困难

在您的测试台代码中,注释出结构成员的reg声明,并使用结构声明

typedef struct packed signed{
    bit valid;
    bit tag;
    bit signed[31:0] data;
}my_data;

module structure_example5(input clk,input my_data a);

always@(posedge clk) begin
    if(a.tag>a.valid)begin
      $display("G");
    end
    else begin
      $display("L");
    end
  end

endmodule:structure_example5

//TEST BENCH

module structure_example5_tb;

reg clk;
  reg a.tag,a.valid;  

  structure_example5 uut (clk,a);

  initial begin
   #5 
   clk=0;
   forever
     #5clk=!clk;
  end

  initial begin
    a.tag=1'b1;
    a.valid=1'b0;
    #50
    $finish();
  end 
endmodule:structure_example5_tb
并尝试运行您的代码,可以在

更新:

根据Dave的建议,当使用包与多个模块共享TypeDef时,建议更好的解决方案是使用、定义包内的所有TypeDef并将包导入所需的模块中,它可以是任何模块,包括testbench和DUT

例如:

当您需要模块内的软件包内容时,请使用

package my_pkg;    
typedef struct packed signed{
          bit valid;
          bit tag;
          bit signed[31:0] data;
      }my_data;
endpackage

还使用package更新了上面提到的链接

,我强烈建议在公共包中定义
typedef
s,并在跨多个模块共享类型时导入该包。请看@dave_59,我完全同意您的观点,因为它是一个tb,我只是直接从编译单元获取它,在阅读了本文后,我注意到它可能会导致不兼容的类型,因此更新了答案,并且非常喜欢文章中关于包的精确描述“从包中导入名称不会复制文本;它使该名称在另一个包中可见,而无需复制定义“
package my_pkg;    
typedef struct packed signed{
          bit valid;
          bit tag;
          bit signed[31:0] data;
      }my_data;
endpackage
import my_pkg::*;