どうやら
”メモリを推定する記述の場合に不具合が出る”
ようです。
■サンプル1 2bitGCC
reg [1:0] gcc
always @ (posedge CLK or posedge RST) begin
if (RST) gcc <= 0;
else
case (gcc)
0 : gcc <= 1;
1 : gcc <= 3;
3 : gcc <= 2;
2 : gcc <= 0;
default : gcc <= 0;
endcase
2bitのカウンタ(GrayCode)をcase文で記述。結果RTL記述より2個多い、4bit分のレジスタが合成された
これに対しては、前回に書いたように、
Gray2Bin→+1→Bin2Gray→Reg
の回路を記述すれば最小構成で合成される。
■サンプル2 4input RoundRobinArbiter
reg [3:0] timeout_counter;
reg [2:0] sequence;
wire timeout;
always @ (posedge CLK or posedge RST) begin
if (RST) sequence <= 0;
else begin
case (sequence)
0 : if (REQUEST1) sequence <= 1;
else if(REQUEST2) sequence <= 2;
else if(REQUEST3) sequence <= 3;
else if(REQUEST4) sequence <= 4;
1 : if (!REQUEST1 || timeout) begin
if(REQUEST2) sequence <= 2;
else if(REQUEST3) sequence <= 3;
else if(REQUEST4) sequence <= 4;
else if (REQUEST1) sequence <= 1;
else sequence <= 0;
end
2 : if (!REQUEST2 || timeout) begin
if(REQUEST3) sequence <= 3;
else if(REQUEST4) sequence <= 4;
else if(REQUEST1) sequence <= 1;
else if (REQUEST2) sequence <= 2;
else sequence <= 0;
end
3 : if (!REQUEST3 || timeout) begin
中略
end
4 : if (!REQUEST4 || timeout) begin
中略
end
default : sequence <= 0;
endcase
end
end
assign GRANT1 = (sequence == 1);
中略
//timeout counter
always @ (posedge CLK or posedge RST) begin
if (RST) timeout_counter <= 0;
else begin
if (sequence == 0) timeout_counter <= 0;
else timeout_counter <= timeout_counter+1'b1;
end
end
assign timeout = (timeout_counter == 4'hf);
4bitのタイムアウトカウンタと3bitシーケンス制御用レジを記述。結果はRTL記述と同じ7個のレジスタが合成された。
シーケンサの記述に関しては問題なさそうです。
■おまけ ラウンドロビンの配置結果
レジスタ7個に対しLUTが22個なので、このようにスカスカ。記述を工夫すれば詰められそうですが・・
0 件のコメント:
コメントを投稿