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;
このバグを見つけるまでに相当時間がかかりました。 みなさんも十分お気を付けください。