我在接口中使用时钟块进行信号混叠。我想将一些位连接在一起形成一个总线,然后从我的驱动程序驱动这个总线。因此,例如:
interface bus_intf (clk);
input logic clk;
logic[1:0] x_lsb;
logic[1:0] x_msb;
clocking driver_bus @(posedge clk)
default input #1step output #0;
output x_bus = {x_msb, x_lsb};
endclocking
endinterface
现在的问题是,在我的一个断言中,我需要阅读bus_intf.driver_bus.x_bus。如 SV 手册中所述,测试平台不应读取时钟块的输出变量,如果是,则模拟器会吐出错误(或在我的情况下发出警告)。
于是我修改了界面:
interface bus_intf (clk);
input logic clk;
logic[1:0] x_lsb;
logic[1:0] x_msb;
clocking driver_bus @(posedge clk)
default input #1step output #0;
inout x_bus = {x_msb, x_lsb};
endclocking
endinterface
现在的问题是,在我的波形中,我看到创建了两个信号 - x_bus和x_bus__o。我理解 Questasim 这样做的原因——它是为了将inout声明分开,以便我可以查看两个版本。然而,现在的问题是我所有的时钟驱动都延迟了一个时钟周期!因此连接到 DUT 的x_bus__o比x_bus晚一个时钟周期。尽管我明确指出输出偏斜为#0,但还是如此。
知道为什么会这样吗?我做错了什么还是我误解了?