我正在尝试在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
答案 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