C to Verilogというサイトを見つけた。最近はいろいろ高位合成ツールもあるようだけれど、きっと高価なものだと想像してしまう。このサイトだと、無料でCコードからVerilogコードを生成してくれる。試しに、サイトにもあるpop countのコードをverilogに変換してシミュレーションしてみた。

ちなみに、ポップカウントというのは、変数中の1の数のこと。例えば、a=0x12だと、二進数で00010010だから、ポップカウントは2になる。

ポップカウントを計算したいデータ(モジュールへの入力)は、mem_BというBRAMに格納されている。また、計算結果はmem_Aに格納する。

シミュレーションの様子を次に示す。まずはシミュレーション開始時。

resetをテストベンチから入力すると、rdyがLになる。生成されたモジュールがmem_B_addr0を順次カウントアップしている。mem_B_outから得るデータでモジュールが計算を行う。最初の方はmem_B_addr0が1clkごとに7になるまでカウントアップしているのに注目できる。これはこのモジュールがパイプラインで計算しているから。

120nsでmem_A_mode0がHになる。これは最初のデータ0に対するポップカウントが計算でき、mem_Aに結果を格納するためのWrite Enable信号である。mem_Aのアドレス0に0(mem_A_in0に出力されている)をライトしている。160nsでもまたmem_A_mode0がHである。これはアドレス1にデータ1のポップカウント1をライトするための信号。


次にシミュレーション最後の部分を示す。rdyがHになると終了。最後の出力は、データ0x3FFに対するポップカウント10(=0x0a)である。


正しく求められていることが分かる。

少し試して見ただけだが、これは超便利。複雑なロジックだと自分でステートマシンをこねくり回さないといけないし、後で見ても理解不能なコードになりがちなので、時間的な展開を自動的に行ってくれるというのは相当な省力化である。これを作ってくれた頭の良い人に感謝。

自分でCコードを入力するときには、トップレベル以外の関数はstatic inlineを付けるのに注意。

Comments