読者です 読者をやめる 読者になる 読者になる

ゆとりーなの日記

日記的な事を書いて行くと思はれる

とあるプラーのverilog遊戲

最近verilogを弄つて遊んでゐるのでチラチラプラー的感想でも書いてみようかなと思つたので書いていきますよと。
まあ全體的な感想を言へば可也クソに感じますね。特に組合せ囘路を書くのが辛いです。まあ勿論verilog初心者の感想なので、後ろから打たれる可能性が十二分に有り得るのですが惡しからず。因みに環境はフリーのverilogと言へばのいかろすべりろぐです。
で、まづ良さげと思つたところから行きます。

module foo(input wire hoge, input wire [4:0] huga, output wire hage);

テキトーにシンタックスハイライト狙つてみたらいけました。嬉しいですね。で、かういふモジュールがあつた時に

wire hoge;
wire [4:0] huga;
wire hage;
foo f(.foge (hoge), .hage (hage), .huga (huga);

名前附き引數みたいに呼べるのが結構幸せです。可讀性考へて配線一本一本に名前付けていくと假引數の數が可也爆發するので順番とか迚も覺えてられませんからね。假引數名間違へてたらエラーになりますし、假引數と引數の配線長違ふと警告が出るのも良さげです。警告を出すだけ出して潰す事に快感を覺える"靜的"嗜好を持つ物にとつては垂涎物ですよ。唯、假引數に引數割當て忘れても無警告なのでここは要注意ですね。何と言ふか、iverilogは警告ぬる目な氣がします。
で、次が問題の組合せ囘路の書き方です。まあ大體alwaysを使ふ派閥とfunctionを使ふ派閥があるやうなのですが、個人的にはどつちもどつちと言ふか、どちらも缺點があつていまいち使ひ辛いのです。
取敢ずalwasの方ですが、

wire [1:0] foo;
wire [3:0] hoge;
wire [3:0] huga;
assign foo = //なんか割當て
always @(*) begin
  case (foo)
    0: begin
      hoge = 4'b0000;
      huga = 4'b0001; 
    end 1: begin
      hoge = 4'b0001;
      huga = 4'b0101;
    end default: begin
      hoge = 4'b0011;
      huga = 4'b0100;
    end
  endcase
end

まあテキトーですがこんなになる訣ですね。*で全信号線が變化した時を捉へて處理をするのでまあ組合せ囘路が出來さうな氣はします。記述量も少なくて濟んで良いのですがこれはdefault節と言ふか、何らかの信号への代入を忘れると記憶素子が生成されて組合せ囘路が出來ると云ふ有名な罠があります。まあこの罠もクソいのですが慣れれば囘避出來さうな氣もします。しかしalwaysは順序囘路を作るときに書くものと云ふ考へ方が結構しつくりくるので出來ればこつちは餘り書きたくないと云ふ心理が働くのですね。C++で言へばstructとclassをきちんと使ひ分けたいみたいな氣分に近いのでせうか。
で、對抗馬のfunctionですが、

wire [1:0] foo;
wire [3:0] hoge;
wire [3:0] huga;
assign foo = //なんか割當て
function [7:0] foo_dec:
  input [1:0] foo;
  begin
    case (foo)
      0: begin
        foo_dec = {4'b0000, 4'b0001};
      end 1: begin
        foo_dec = {4'b0001, 4'b0101};
      end default: begin
        foo_dec = {4'b0011, 4'b0100};
      end
    endcase
  end
endfunction
assign {hoge, huga} = foo_dec(foo);

心なしか少々記述量が増えます。その代はりに何らかの信号への代入を忘れても、空気讀んでテキトーに計らつてくれるので記憶素子が勝手に出來るなんて心配はありません。安心ですね。で、それはまあ良いのですが、こちらも罠があるのですよ。まづ、引數でfooを渡してますが、このfooを手が滑つて書き忘れても外側のfooが使はれて事故の元だとか(實はどう事故の元なのかはよく解つてゐなかつたりします)、引數の信号長が違つても警告が出なかつたりとか、戻りの信号長忘れたり間違へてても警告出ないとか、とにかく警告がぬるいのです。實際にどこがをかしいのかは波形見て氣附くつて流れになるまでです。矢張りコンパイル時に見つけて欲しいのが人情なんですよね。あとまあこの手の警告は厳しいコンパイラ使へばなんとかなる樣な気もしますが、このやうに信号を連結すると、連結忘れや連結順滑つた時に警告出すのは結構難しい樣な氣もするんですよね。
結論を言へば、どうもverilogで組合せ囘路を氣持ちよく書く方法がよく分からないと云ふ點に落ち着きます。で、もうverilogはあかんと文法が嚴格だと噂のVHDLも見てみたのですが、此方は文法がアルゴル系由來で一瞬で頁を閉じたのでした。