2017-12-29 8 views
-1
module hh (input [2:0] a [0:3], output b); 

wire [2:0] c1 [4:1]; 
wire [0:2] c2 [0:3]; 
wire d; 

u_hh_1 hh (.a(c1   ), .b(d)); // it is right; 
u_hh_2 hh (.a(c1[4:1][2:0]), .b(d)); // illegal slice name; 
u_hh_3 hh (.a(c2   ), .b(d)); // it is right, 
             // and in the netlist, 
             // the bits of c2 is swapped to a; 
u_hh_4 hh (.a(c2[0:3][2:0]), .b(d)); // illegal slice name; 

Iは、ポートリストのアレイを使用するだけVERILOGない、SystemVerilogのに支持されている知っています。これをより読みやすくするために、範囲を明示的に表示したいが、それは違法である。関数でも同じ問題が発生します。これをどうすれば解決できますか?SystemVerilogの使用アレイ

答えて

1

SystemVerilogシンタックスでは、複数の範囲を指定することはできません。範囲は選択した最も右側の範囲にする必要があります。

明示したい場合は、typedefを作成し、キャストを使用します。 typedefを使うことは、あなたのコードについて任意の数値を散らばわせるのではなく、より良いプログラミングの習慣です。

typedef logic [2:0] blue_port_t[4:1]; 
typedef logic [0:2] green_port_t[0:3]; 

module hh (input green_port_t a, output wire b); 

wire blue_port_t c1; 
wire green_port_t c2; 
wire d; 

u_hh_1 hh (.a(c1   ), .b(d)); // 
u_hh_2 hh (.a(blue_port_t'(c1)), .b(d)); // 
u_hh_3 hh (.a(c2   ), .b(d)); // it is right, 
             // and in the netlist, 
             // the bits of c2 is swapped to a; 
u_hh_4 hh (.a(green_port_t'(c2)), .b(d)); 

キャストは、使用しているタイプのドキュメント以外は実行しません。

0

Verilogでは、ベクタをMSからLSに、好ましくは0にするようにしてください。これは他のVerilogコーダが読みやすくするための規則です。
同じ慣例:メモリはちょうど反対の方向に進む必要があります。 (しかし、これはそうでない場合、私はたくさんのコードを見てきました。あなたがそうするなら、いくつかのシミュレータが警告を出します)。あなたのコードは、合成-できるようにしたい場合は

wire [2:0] c1 [0:3]; 
wire [2:0] c2 [0:3]; 

次の2つの次元のスライスを使用することができますが、インデックスは[memory_address] [ビットスライス]でビットスライスはオプションです。省略された場合は、エントリ全体を取得します。 したがって、あなたが行うことができます。

c1[1][1:0] // LS 2 bits of second entry of memory c1 
c1[0]  // First memory entry of c1 which is 3 bits wide 

をあなたが行うことはできません:それは任意の標準でサポートされていないと同時に、メモリの最初の2つのエントリを選択することになるとして、論理的である

c1[1:0] 

ハードウェア

関連する問題