2016-05-06 41 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

您認爲硬件或軟件模塊/功能如何工作?輸入和輸出,模塊/功能修改輸入以產生輸出。爲什麼不行? –