入門Verilog HDL記述の回路を検証してみた。122ページのシリアル・パラレル変換について、納得できない記述だったので、やってみた。
記述は、
module Seri_Par(ck, res, en, si, q);
input ck;
input res;
input en;
input si;
output [3:0] q;
reg [3:0] q;
always @(posedge ck) begin
if (res)
q <= 4'h0;
else if (en) begin q <= q << 1;
q[0] <= si; end
end
endmoduleというもの。どうもq[0]に2回代入されているのが気になる。シミュレーションしてみた。動作はOK。

XSTで論理合成後のRTL回路図を表示してみた。

いたって正常。
これで青の部分を下のように変更するとだめだということだ。
q[0] <= si;
q <= q << 1;
つまり記述の順番を変えるとだめ。これでシミュレーションしてみると

確かにだめだ。出力が出ない。
次にXSTで論理合成後のRTL回路図は、

なんだこれは? q[0]がGNDに接続されているだけだ。
125ページの正解例では、
q <= {q, si};だったが、これも式の左辺と右辺のビット幅が合わないので、気持ち悪い。
VHDL好きな私ならば、こう書きたい。
q[3:1] <= q[2:0];
q[0] <= si;
もしくは1行で書くならばこうか?
q <= {q[2:0], si};Verilog書く時は本の記述で良いのかもしれないが、私は下の2例のように書きたい。
- 2005年11月24日 22:41 |
- 入門Verilog
-
| トラックバック:0
-
| コメント:1
昔の記事に対するコメントで申し訳ありません。
VHDLから入った者ですが、私もこの書籍のこの部分で「並列代入のくせに、嘘だろ・・?」と思いました。
まず間違いなく混乱するので、私もビットのスライスを使って代入しています。
VerilogとVHDLとどちらから始めようかと思った時に、面倒くさそうだったVHDLから始めたのですが、面倒な分、かっちりしていて意外に手に馴染んでしまっています。
- 2008/07/04(金) 19:26:56 |
- URL |
- #-
- [ 編集 ]