systemVerilogサンプル・その4 打ち止め。。

systemVerilogは合成出来る部分もかなりな物です。。

 →netから拾ってきたuart16550をmyバスへつなげようと中身を見たらゲロが出そうなコード。。。
  仕様書だけもらって作り直した。uart16550程度ならチョロチョロと自分で書いた方が速いと
  思えるだけの記述力があると思う。

  もう少し整理してwishbone互換にしから、LGPLで適当なnetに載せようかな。
   -> my-uart16550.sv
   my-timer_module.svも載せるぜ~~

* structをportへ引き出してみる。

ユーザ定義のデータ型うれしい点はデータ整理が出来るだけではない。
処理も一括で出来る所にある。
下記の例は struct timerを一括してclkサンプリングしている。

typedef struct packed{
                logic [31:0] count ;
                state_t      state ;
                logic [31:0] c_value ;
                logic        intr ;
                control_t    cont_reg ;
                } timer_t ;
// ------
  timer_t timer,timer_l ;

  always_ff @(posedge clk) timer_l <= #1 timer ;

合成もできるよ。

注)modelSimではstruct packedでないとエラーになる。→packedは入れ子が可能なので実害は無いな。
Quartus2-9.1sp1ではpackedでなくても合成可能。。
     →シミュレータが合成器に負けてるじゃん。。明太子君しっかりしたまえ~~


structはportにも出せる合成も可能。。下記に例が。。
  →interface文は合成できないんだな。。

module timer_module
(
 input        clk_i,
 input        nrst_i,
 input [3:0]  adr_i,
 input [31:0] dat_i,
 input        cyc_i,
 input        stb_i,
 input [3:0]  sel_i,
 input        we_i,
 output [31:0] dat_o,
 output       ack_o,
 output       intr_o,
 output timer_t tm_t0,   // <---
 output timer_t tm_t1    // <---
 ) ;

合成後のpinout-fileを見ると
"."で区切られた信号名が付けられる。。(Quartus2-sp1)
.......
.......
dat_o[11]                    : A6        : output : 2.5 V                    
tm_t0.c_value[6]             : A7        : output : 2.5 V                  
dat_i[16]                    : A8        : input  : 2.5 V                   
tm_t0.cont_reg.intr_clr      : A9        : output : 2.5 V                
we_i                         : A10       : input  : 2.5 V                    
GND+                         : A11       :        :                        
GND+                         : A12       :        :                         
tm_t1.cont_reg.count_en      : A13       : output : 2.5 V                   
tm_t1.count[3]
........
........
....... 

systemVerilog Quartus2 modelSim