您可以向前声明要用作端口类型的类型,还是可以将接口用作外部端口?

时间:2019-01-04 09:43:52

标签: system-verilog vivado

我正在尝试在SystemVerilog中设计一些硬件,但遇到了无法找到答案的问题。这种情况是我有一个顶层模块(跟踪器),它需要具有特定类型的输出端口。此类型是在参数化接口内指定的类型定义的结构,因为此类型定义需要在顶级模块的某些子模块之间共享。我希望能够有一个在接口中指定类型的输出端口,并能够将该类型传递到各种子模块中以用于其他目的。

至关重要的是,我还试图将该硬件作为Vivado中的自定义IP的一部分(这是一个较大项目的一部分),因此我的目标是一个顶层模块,其中可以定义一些参数其余模块完全封装。我意识到这将涉及到最后将Verilog包装器放置在所有内容的顶部,但此刻我只专注于使其在仿真中正确运行。

我遇到的问题是,因为必须实例化接口,所以不能将其用作顶层端口,因为您将在哪里实例化接口?但是,因为我要做的只是确定在接口内部引用typedef,所以我可以以某种方式转发这些声明,以便可以将类型称为端口类型并将其传递给其他子模块?

因此,从本质上讲,有人对我如何实现这一目标有任何想法吗?如果我完全不正确地处理此问题,请随时告诉我, dave59 此处(https://verificationacademy.com/forums/systemverilog/parameterized-struct-systemverilog-design)提供了将typedef捆绑到接口中的想法,花了一天的时间来解决这个问题,却一无所获。非常感谢您提供的任何帮助,我们将为您提供进一步的澄清。

这里是当前代码。为了清楚起见,它们都在同一文件中声明。

接口定义

interface trace_if #(
parameter TDATA_WIDTH = 32, 
parameter INSTR_ADDR_WIDTH = 32, 
parameter INSTR_DATA_WIDTH = 32,
parameter DATA_ADDR_WIDTH = 32);

... (IF_DATA etc. defined here)

typedef struct packed {
    bit [INSTR_DATA_WIDTH-1:0] instruction;
    bit [INSTR_ADDR_WIDTH-1:0] addr;
    bit pass_through;
    IF_data if_data;
    ID_data id_data;
    EX_data ex_data;
    WB_data wb_data;
 } trace_format;

 trace_format trace_output;

endinterface

顶级模块

module tracer
#(
parameter INSTR_ADDR_WIDTH = 32,
parameter INSTR_DATA_WIDTH = 32,
parameter DATA_ADDR_WIDTH = 32,
parameter TDATA_WIDTH = 32,
parameter TRACE_BUFFER_SIZE = 64
)
(   
... other ports declared
trace_if.trace_output trace_data_o
);
// Instantiating the interfaces for communication between submodules

logic if_data_valid;
trace_if #(TDATA_WIDTH, INSTR_ADDR_WIDTH, INSTR_DATA_WIDTH, DATA_ADDR_WIDTH) if_data_o();
logic id_data_ready;
trace_if #(TDATA_WIDTH, INSTR_ADDR_WIDTH, INSTR_DATA_WIDTH, DATA_ADDR_WIDTH) id_data_o();
logic ex_data_ready;
trace_if #(TDATA_WIDTH, INSTR_ADDR_WIDTH, INSTR_DATA_WIDTH, DATA_ADDR_WIDTH) ex_data_o();
logic wb_data_ready;

// Instantiating the submodules

if_tracker if_tr (.*);
id_tracker #(INSTR_DATA_WIDTH, DATA_ADDR_WIDTH, TRACE_BUFFER_SIZE) id_tr(.if_data_i(if_data_o), .*);
ex_tracker #(DATA_ADDR_WIDTH, 256, TRACE_BUFFER_SIZE) ex_tr(.id_data_i(id_data_o), .wb_previous_end_i(previous_end_o), .*);
wb_tracker #(TRACE_BUFFER_SIZE) wb_tr(.ex_data_i(ex_data_o), .wb_data_o(trace_data_o), .*);

... other module related stuff

endmodule

1 个答案:

答案 0 :(得分:1)

如果发布MCVE,这些事情会更容易。我想你在问的是这个

IWebElement body = driver.FindElement(By.TagName("body"));
Assert.IsTrue(body.Text.Contains("TEXT"));

如果是这样,我认为您需要将interface i #(parameter p = 1); typedef struct packed { bit [p-1:0] b; } s_t; s_t s; endinterface module m #(parameter p = 1) ( /* how can I have a port of type s_t ? */ ); i i0 (); endmodule 放在一个包装中:

struct

https://www.edaplayground.com/x/4zQ_