我如何访问模块内部的内部寄存器?

问题描述 投票:4回答:2

我在Verilog中具有这种体系结构/拓扑:

http://i.imgur.com/irIsD40.png

如何在SystemVerilog中访问内部寄存器IntReg,而不是IntModule中的输入/输出?

always @(posedge clk) begin
    $display ("[Time %0t ps] IntReg value = %x", $time, DUT.IntModule.IntReg);
end

我可以使用绑定吗?怎么样?

system-verilog internals
2个回答
2
投票

您不需要使用bind

module DUT;
bit clk;
initial begin
    repeat (5) begin
        #5 clk = 0; 
        #5 clk = 1;
    end
end

always @(posedge clk) begin
    $display ("[Time %0t ps] IntReg value = %x", $time, DUT.IntModule.IntReg);
end

IntModule IntModule ();
endmodule

module IntModule;
    reg IntReg = 1;
endmodule

/*
[Time 10 ps] IntReg value = 1
[Time 20 ps] IntReg value = 1
[Time 30 ps] IntReg value = 1
[Time 40 ps] IntReg value = 1
[Time 50 ps] IntReg value = 1
*/

2
投票

是,您可以将interfacebind一起使用:

// Interface
interface my_if(
  input IntReg
);
endinterface: my_if

// Interface bind
bind intModule my_if my_if0(
  .IntReg(IntReg)
);

然后像这样访问寄存器:

virtual my_if _if = top.DUT.IntModule.my_if0;
$display ("[Time %0t ps] IntReg value = %x",
  $time, _if.IntReg);

带有EDA Playground上模拟结果的完整示例:http://www.edaplayground.com/s/4/115

© www.soinside.com 2019 - 2024. All rights reserved.