場末のソフトウェアエンジニアのブログ

雑多な記事ばっかりのブログ

【忘備録】NSLにおけるgenerate文について

NSLにはgenerate文というものがあり、バレルシフタをgenerate文を使って書き直そうとしていたときの話です。 Verilogのgenerate文と似たようなもので、HDL記述が簡潔になるというメリットがあります。

// バレルシフタ

wire shifted[32];

integer i;
variable v[32];
variable n[5];

v = inp;
n = num;

generate (i = 1; i <= 16; i = i * 2) {
    if (n[0]) {
        if (v[31]) {
            v = {i{1'b1}, (v >> i)[(31 - i):0]};
        } else {
            v = {i{1'b0}, (v >> i)[(31 - i):0]};
        }
    }

    n = n >> 1;
}

shifted = v;

return shifted;

普通にif文が使えると思って、上記のように記述していました。 しかし、シミュレーションでは全く正しい結果と異なる値が出力されました。

正しくは以下のように記述する必要があるようです。 つまり、generate文の中ではif文は使用できないということです。

// バレルシフタ

wire shifted[32];

integer i;
variable v[32];
variable n[5];

v = inp;
n = num;

generate (i = 1; i <= 16; i = i * 2) {
    v = if (n[0])
            if (v[31]) {i{1'b1}, (v >> i)[(31 - i):0]} 
            else {i{1'b0}, (v >> i)[(31 - i):0]}
        else v;
    n = n >> 1;
}

shifted = v;

return shifted;

このバグを見つけるまでに相当時間がかかりました。 みなさんも十分お気を付けください。