2017-06-13 30 views
0

私はVerilogを学習しようとしていますが、forループを使用すると何が問題なのか分かりません。forループを使用してverilogで出力するxxxを取得する

実装しようとしているモジュールの例では、入力の最初のビットを設定しますが、出力の残りのビットは入力と出力の両方に基づいて設定されますが、 testbench-

`timescale 1ns/1ns 
module example_module_tb; 
reg[15:0] A; 
reg[15:0] B; 
wire [15:0] C; 

example_module e(A,B,C); 
initial begin 
A = 16'd23; 
B = 16'd32; 
end 

initial begin 
$dumpfile("example_module_tb.vcd"); 
$dumpvars; 
end 

initial #400 $finish; 

endmodule 

Iはveriwellでこれを実行し、GTK波を使用すると、Iは出力線Cは16'bxxxxxxxxxxxxxxx0であることを得るため、および出力 -

の前ビット
module example_module(A,B,C); 
input [15:0] A; 
input [15:0] B; 
output [15:0] C; 
reg[15:0] C; 
integer i; 
[email protected](A or B)begin 
    C[0] = A[0]&B[0]; 
    for(i = 0;i<15;i=i+1)begin 
    C[i+1] = A[i+1]|(B[i+1]&C[i]) ; 
    end 

end 
endmodule 

基本的に最初のビットはセットされていますが、他のビットはセットされていませんか?

誰かがこれを修正する方法を教えてください。

ありがとうございます!

EDIT:実際に使用している3つのファイルがありますが、CLA_logic_tb.vのxxxが表示されています。

GP_generator.v

module GP_generator(A,B,G,P); 
input [15:0] A; 
input [15:0] B; 

output [15:0] G; 
output [15:0] P; 

reg [15:0] G; 
reg [15:0] P; 

integer i; 

[email protected](A or B) 
begin 
for(i = 0; i<16; i= i +1)begin 
    G[i] = A[i]&B[i]; 
    P[i] = A[i]^B[i]; 
end 
end 
endmodule 

Cの最初のビットが設定されている

`timescale 1ns/1ns 
module CLA_logic_tb; 
reg[15:0] A; 
reg[15:0] B; 
wire [15:0] C; 

CLA_logic c(A,B,C); 

initial begin 
    A = 16'd23; 
    B = 16'd32; 
end 

initial begin 
    $dumpfile("CLA_logic_tb.vcd"); 
    $dumpvars; 
end 

initial #400 $finish; 

endmodule 

CLA_logic.v

module CLA_logic(A,B,C); 
input [15:0] A; 
input [15:0] B; 
output [15:0] C; 

reg[15:0] C; 


wire [15:0] G; 
wire[15:0] P; 

GP_generator g1(A,B,G,P); 

integer i; 


[email protected](A or B)begin 
C[0] = A[0]&B[0]; 
for(i = 0;i<15;i=i+1)begin 
C[i+1] = G[i]|(P[i]&C[i]) ; 
end 

end 
endmodule 

CLA_logic_tb.vが、残りギブXXX

+0

VeriWell 2.8.7と他のすべてのシミュレータでhttps://www.edaplayground.comで罰金を科せます。 – Greg

+0

ねえ!そうだね、そうだよ!しかし、私がそれを拡張しようとすると(私の編集された質問を参照してください)、私はまだ出力のためにxxxxを取得します。理由を知っていますか? –

答えて

0

誰にもこんにちは見て、

エラーは、常にブロックにあります!

代わりの

always @(A or B) 

それが使用されているすべての変数を含める必要があります!だからそれはする必要があります

​​
+0

Verilog-1995のみをサポートしているVeriWellを使用していなかった場合は、Verilog-2001以降のバージョンの 'always @ * '(または同義語' always @(*) ')を自動感度。 Emacsのテキストエディタには、自動生成に関する回避策があります。https://www.veripool.org/wiki/verilog-modeの '/ * AS * /'を参照してください。コマンドラインや選択したエディタからバッチモードで使用することができます(エディタがスクリプトとターミナルコマンドを実行できると仮定します)。 – Greg

+0

少し余分な研究をしました。オリジナルのVeriWellはVerilog-1995に限定されています。しかし、github(https://github.com/balanx/veriwell)にVeriWell 3と呼ばれるフォークされたバージョンがあります。これは、変更ログによるとVerilog-2001のいくつかの機能をサポートしています。 – Greg

+0

お返事ありがとうございました!おそらく本当にばかげた質問ですが、フォークされたバージョンを私のコンピュータにどうやって渡すのですか? –

関連する問題