以verilog代码引用的调用
我正在尝试将C++代码更改为verilog HDL。 我想写一个模块来改变它的一个输入。 (有些如何在C++中引用通过引用) 因为我知道有没有办法在Verilog中通过引用模块编写调用(我不能使用systemverilog) 这里是我编写的代码,它的工作原理。有没有更好的方法来做到这一点?! 我的问题是,我想通过引用调用的寄存器是一个大数组。这种方式复制寄存器并且有很多成本。以verilog代码引用的调用
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)
);
[email protected](*)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
的Verilog不是软件编程语言;它是一个硬件描述语言。模块的输入是金属片(导线,导轨,引脚);模块的输出是金属片。如果你想要一个既是输入又是输出的端口,你可以使用inout
。但是,最好避免inout
端口;使用单独的输入和输出通常要好得多。
A Verilog 模块不是软件功能。没有东西被复制到输入中;没有东西从输出中复制。 Verilog模块是一个硬件块:它具有输入(金属承载信息块)和输出(金属承载信息块)。
您有权说在SystemVerilog中可以使用pass-by-copy或pass-by-reference。如果您希望将大型数据结构传递给函数或传入/传出任务,那么通过引用传递可以节省模拟时间。
thanx,我知道。你是对的。正如你所看到的,我得到了两个不同的模块输入和输入。但我想知道是否有更好的方法来实现这一点,但费用很小 – Mehdi
实际上,SystemVerilog确实通过了模块端口的引用。但这不会对这个人有所帮助。 –
谢谢@ dave_59。其实,一些佯谬的铃声响了起来。我最好修改一下。 –
通过引用意味着地址,所以要直接将其转换为hdl,您需要提供一种方式让模块进入该总线并根据该地址执行事务。或者更好,如果你需要这个作为一个输入,拿到结构中的每个项目并且从它们中作出单独的输入。如果它是通过引用传递的,因为它是一个输出或者也是一个输出,那么可以为结构中的每个项目创建单独的输出。该模块然后区分该子项目的输入版本和该子项目的输出版本。
my.thing.x = my.thing.x + 1;
变得像
my_thing_x_output = my_thing_x_input + 1;
你确定这个工程?!你可以重新创建我的样本吗? – Mehdi
您认为硬件或软件模块/功能如何工作?输入和输出,模块/功能修改输入以产生输出。为什么不行? –
您需要提供更多关于“需求”的信息。我假设你正试图将软件算法转换成硬件。程序流程的直接翻译很可能不起作用。另外,为什么你不能使用SystemVerilog? –
是的,我试图将软件算法转换为HDL。该算法非常复杂,我无法将其更改为硬件。所以我会逐行将其更改为hdl代码 – Mehdi
鉴于您的答案是低于(“逻辑区域”),这听起来像将算法更改为硬件是_exactly_您正在尝试。当你编写用于在FPGA或IC上实现的HDL代码时,你正在做的是设计硬件_exactly_。您需要开始将算法转换为硬件,然后在HDL中对其进行编码。 HDL不是避免设计硬件的一种方法。有些工具可以将C代码转换为HDL代码/硬件,但它们不是一个快速修复的方法 - 在获得结果之前,需要使用它们的相当多的练习。 –