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