Verilog で、合成可能なパラメータ化されたプライオリティ エンコーダを作成しようとしています。具体的には、ベクトル内の最下位の 1 を見つけて、その 1 だけを含むベクトルを返したいと考えています。次に例を示します。
IN[3:0] | OUT[4:0]
--------+---------
1010 | 00010
1111 | 00001
0100 | 00100
0000 | 10000 (special case)
したがって、ベクトルが 4 ビット幅の場合、コードは次のようになります。
if (in[0]==1'b1) least_one = 1;
else if (in[1]==1'b1) least_one = 2;
else if (in[2]==1'b1) least_one = 4;
else if (in[3]==1'b1) least_one = 8;
else out = 16; // special case in==0, set carry bit
入力/出力ベクトルの長さがパラメーター化されているため、これを行うには一般的でスケーラブルな方法が必要です。私の現在のコードは次のとおりです。
module least_one_onehot
#(parameter ADDR_WIDTH=4)
(output reg [ADDR_WIDTH:0] least_one,
input [ADDR_WIDTH-1:0] in);
genvar i;
always @(in) begin
if (in[0]==1'b1) least_one = 1;
generate for (i=1; i<ADDR_WIDTH; i=i+1) begin : U
else if (in[i]==1'b1) least_one = 2**i;
end
endgenerate
else least_one = 2**ADDR_WIDTH;
end
endmodule
これをコンパイルしようとすると、次のエラーが表示されます。
file: least_one_onehot.v
generate for (i=1; i<ADDR_WIDTH; i=i+1) begin : U
|
ncvlog: *E,GIWSCP (least_one_onehot.v,10|8): Generated instantiation can only be valid within a module scope [12.1.3(IEEE 2001)].
else if (in[i]==1'b1) least_one = 2**i;
|
ncvlog: *E,NOTSTT (least_one_onehot.v,11|6): expecting a statement [9(IEEE)].
endgenerate
|
ncvlog: *E,GIWSCP (least_one_onehot.v,13|12): Generated instantiation can only be valid within a module scope [12.1.3(IEEE 2001)].
else least_one = 2**ADDR_WIDTH;
|
ncvlog: *E,NOTSTT (least_one_onehot.v,14|5): expecting a statement [9(IEEE)]
generate、if、always ステートメントのさまざまな配置を試みましたが、すべて成功しませんでした。これの適切な構文を知っている人はいますか? ケースステートメントの実装またはその他の代替手段も問題ありません。ありがとう。