在verilog代码中通过引用调用

时间:2016-05-06 11:55:41

标签: verilog

我正在尝试将c ++代码更改为verilog HDL。 我想编写一个更改其输入之一的模块。 (有些如何在c ++中通过引用调用) 我知道没有办法在verilog中通过引用模块编写调用(我不能使用systemverilog) 这是我编写的代码,它的工作原理。有没有更好的方法来做到这一点?! 我的问题是我希望通过引用调用的寄存器是一个大数组。这种方式重复了寄存器并且花费了很多。

module testbench();
reg a;
wire b;
reg clk;
initial begin
    a = 0;
    clk = 0;
    #10
    clk = 1;
end

test test_instance(
    .a(a),
    .clk(clk),
    .aOut(b)
    );

always@(*)begin
        a = b;
end
endmodule



module test(
    input a,
    input clk,
    output reg aOut
    );
    always @(posedge clk) begin
        if (a == 0)begin
            a = 1;
            aOut = a;
        end
    end

endmodule

2 个答案:

答案 0 :(得分:1)

Verilog不是软件编程语言;它是硬件描述语言。模块的输入是金属片(电线,轨道,引脚);模块的输出是金属片。如果您想要一个既是输入又是输出的端口,您可以使用inout。但是,最好避免inout个端口;使用单独的输入和输出通常要好得多。

Verilog 模块不是软件功能。没有任何东西被复制到输入;没有从输出中复制。 Verilog模块是一块硬件:它有输入(输入信息的金属片)和输出(输出信息的金属片)。

您可以说在SystemVerilog中可以使用pass-by-copy或pass-by-reference。如果您希望将大型数据结构传递到函数中或进入/抽出任务,则通过引用传递可以节省模拟时间。

答案 1 :(得分:0)

通过引用逐个地址,因此要直接将其转换为hdl,您需要为模块提供一种方法来获取该总线并根据该地址执行事务。

或者更好的是,如果您需要将此作为输入,请获取结构中的每个项目并从中进行单独输入。如果它是通过引用传递,因为它是输出或也是输出,那么您为结构中的每个项创建单独的输出。然后,模块区分该子项的输入版本和该子项的输出版本。

my.thing.x = my.thing.x + 1;

变得类似

my_thing_x_output = my_thing_x_input + 1;