2016-05-06 33 views
-1

我正在尝试将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 
+3

您需要提供更多关于“需求”的信息。我假设你正试图将软件算法转换成硬件。程序流程的直接翻译很可能不起作用。另外,为什么你不能使用SystemVerilog? –

+0

是的,我试图将软件算法转换为HDL。该算法非常复杂,我无法将其更改为硬件。所以我会逐行将其更改为hdl代码 – Mehdi

+0

鉴于您的答案是低于(“逻辑区域”),这听起来像将算法更改为硬件是_exactly_您正在尝试。当你编写用于在FPGA或IC上实现的HDL代码时,你正在做的是设计硬件_exactly_。您需要开始将算法转换为硬件,然后在HDL中对其进行编码。 HDL不是避免设计硬件的一种方法。有些工具可以将C代码转换为HDL代码/硬件,但它们不是一个快速修复的方法 - 在获得结果之前,需要使用它们的相当多的练习。 –

回答

1

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

A Verilog 模块不是软件功能。没有东西被复制到输入中;没有东西从输出中复制。 Verilog模块是一个硬件块:它具有输入(金属承载信息块)和输出(金属承载信息块)。

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

+0

thanx,我知道。你是对的。正如你所看到的,我得到了两个不同的模块输入和输入。但我想知道是否有更好的方法来实现这一点,但费用很小 – Mehdi

+2

实际上,SystemVerilog确实通过了模块端口的引用。但这不会对这个人有所帮助。 –

+0

谢谢@ dave_59。其实,一些佯谬的铃声响了起来。我最好修改一下。 –

0

通过引用意味着地址,所以要直接将其转换为hdl,您需要提供一种方式让模块进入该总线并根据该地址执行事务。或者更好,如果你需要这个作为一个输入,拿到结构中的每个项目并且从它们中作出单独的输入。如果它是通过引用传递的,因为它是一个输出或者也是一个输出,那么可以为结构中的每个项目创建单独的输出。该模块然后区分该子项目的输入版本和该子项目的输出版本。

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

变得像

my_thing_x_output = my_thing_x_input + 1;

+0

你确定这个工程?!你可以重新创建我的样本吗? – Mehdi

+0

您认为硬件或软件模块/功能如何工作?输入和输出,模块/功能修改输入以产生输出。为什么不行? –