2016-03-21 53 views
-1

Verilog用のALUを書き留めようとしています。 私が経験したいくつかのエラーがあります。ALU用のVerilogモジュールが正しく動作しません

まず第一に、ここに私のコードは次のとおりです。

module yAlu(z, ex, a, b, op); 

input [31:0] a, b; 
input [2:0] op; 
output [31:0] z, ztemp; 
output ex; 
wire[31:0]a0,a1,a2,a3,a4, atemp; 

assign slt = 0; 
assign ex = 0; 

assign a0 = a & b; 
assign a1 = a | b; 
assign a2 = a + b; 
assign a3 = a - b; 
assign a4 = a[31]^b[31]; 

yMux #(32) lo(zLo, a0, a1, op[0]); 
yMux #(32) hi(zHi, a2, a3, op[0]); 
yMux #(32) temp(atemp, zLo, zHi, op[1]); 
assign z = (op[2] == 1) ? a4 : atemp; 
assign slt = z; 

endmodule 

そしてyAlu.vは、以下の用途:最後にYMUX上記

module yMux(z, a, b, c); 
parameter SIZE = 2; 
output [SIZE-1:0] z; 
input [SIZE-1:0] a, b; 
input c; 
yMux1 mine[SIZE-1:0](z, a, b, c); // 2-­bit 2 -­to-­1 mux and it would be cumbersome to write 32 mux instantiation lines. 
endmodule 

には、以下の使用しています。ここでは

module yMux1(z, a, b, c); 
output z; 
input a, b, c; 
wire notC, upper, lower; 
// Gates and interconnections for MUX 

// if c is 0, z=a. 
// if c is 1, z=b 
not my_not(notC, c); 
and upperAnd(upper, a, notC); 
and lowerAnd(lower, c, b); 
or my_or(z, upper, lower); 
endmodule 

がされています上記のテスト対象製品:

次のように順番に

私の質問:上記のみ

Question 1. 

コードは、0と1のために働くことはそれ以上に動作しません。 例えば、第2のソースコードを、

A = $ランダム性があります。 b = $ランダム;

これは機能しません。 1または0とb = 1または0のときにのみ機能します。

Question 2. 

「slt」機能が正しく機能しているかどうかわかりません。これを教えるインストラクターは、sltが講義で何をしているのか私に話したことはありませんが、グーグルなどでデザインをしてもらう必要があります。

Question 3. 

私がコンパイルすると、次のエラーが発生します。どうしてこれなの?

yAlu.v:38: warning: Port 1 (z) of yMux expects 32 bits, got 1. 
    yAlu.v:38:  : Padding 31 high bits of the port. 
    yAlu.v:39: warning: Port 1 (z) of yMux expects 32 bits, got 1. 
    yAlu.v:39:  : Padding 31 high bits of the port. 
    yAlu.v:40: warning: Port 2 (a) of yMux expects 32 bits, got 1. 
    yAlu.v:40:  : Padding 31 high bits of the port. 
    yAlu.v:40: warning: Port 3 (b) of yMux expects 32 bits, got 1. 
    yAlu.v:40:  : Padding 31 high bits of the port. 

I can't fix this at all. 

私はそれを正しくやっているのか分からない。私の言うことを指示するマニュアルには、十分な説明がなく、サンプル出力もありません。

私はとにかく時間内に終えることができなかったので、私はそれは問題ではないと思いますが、私は、私は私の問題の解決策を知っている必要がありますと思います。あなたが私を助けることができるかどう

はどうもありがとうございました。

+3

タグをスパミングするのをやめてください! VerilogはアセンブラにもC言語にも関係ありません!それはプログラミング言語でさえありません。 – Olaf

答えて

3

警告で示されているように、のポート接続幅が一致していません。取り組むにあたっては、単一の警告などを参照してください。

yAlu.v:38: warning: Port 1 (z) of yMux expects 32 bits, got 1. 
    yAlu.v:38:  : Padding 31 high bits of the port. 

モジュールはポートabczSIZEパラメータによって定義された幅のそれぞれを宣言する。

module yMux(z, a, b, c); 
parameter SIZE = 2; 
output [SIZE-1:0] z; 
input [SIZE-1:0] a, b; 

はまた、SIZEはインスタンス化しながらをオーバーライドあります。今、SIZEの値は、したがって、各abczの幅は、32ビットで32です。ここで

yMux #(32) lo(zLo, a0, a1, op[0]); 
yMux #(32) hi(zHi, a2, a3, op[0]); 
yMux #(32) temp(atemp, zLo, zHi, op[1]); 

、ポートzLozHiはないがポート接続で直接使用宣言です。

セクションは6.10-暗黙宣言、IEEE 1800-2012を参照:識別子がポート発現宣言で使用される場合

、デフォルトのネット型の次に 暗黙ネットのベクトル 幅と仮定しなければなりませんポート式宣言。 宣言されていない識別子がインスタンスへの接続として使用される場合

これは、次いで、暗黙ネットが推測されます。

したがって、zLozHiは、暗黙的に、単一ビットとしてネット残り32ビットを宣言されはゼロが埋め込まれています。

wire [31:0] zLo,zHi; 

は、このような状況でエラーを取得default_nettype noneコンパイラディレクティブを使用するには、次のとを撤去しなければならないすべての警告としてだけではそれらを宣言します。

詳細については、暗黙の宣言については、Sutherland SV Gotchas論文、セクション2.2およびSystemVerilog IEEE 1800-2012を参照してください。

+0

暗黙的に宣言されたワイヤを明示的に宣言せずに32ビットとして設定する方法はありますか? – NoName

+1

暗黙のうちにワイヤを宣言することは一般的に望ましくありません。しかし、あなたは[ここのブログのリンク](http://hereitellyouwhatilearnttoday.blogspot.in/2012/11/disable-implicit-declaration-of-wires.html)を参照することができます。あなたはそれを試すことができます。 – sharvil111

関連する問題