systemVerilogのgenerate文を使ってます??
generate文自体はverilog2001から有りVHDLなら最初から('80年代末頃)から有った。
この文はRTLでは無くてRTLを生成してくれる物。。ちょと言い過ぎだねRTLの接続を簡易化してくれる物と思って良いんじゃないかな。
この文はRTLでは無くてRTLを生成してくれる物。。ちょと言い過ぎだねRTLの接続を簡易化してくれる物と思って良いんじゃないかな。
具体的には
genvar i ; generate : test1 for(i=0;i<7;i++) begin : test assign test[i+1] = test2[i] ; end endgenerate : test1 assign test[0] = test[7] ;とか書くとtestとtest2の接続が一つずれた物が出来る。
今私が書いているRTLは方式検討から。。もちろん特許を取るつもり(広告宣伝特許です。。汗)
納品先も無いのでgenerate文をバンバン使って楽しようと考え。。汗)
調べてみた。。実はverilog2001の頃にgenerate文を使ってみようかなと思ったことが有ったが
インスタンスを上手くgenerate出来るの??と言う疑問があり使わずじまいだった。
今はIEEE1800-2009(systemVerilog)の時代、仕様も明確になったとの報ががnetに有ったので
試験的に書いてみた。(RTLはいつものcount4.svで)
注)pinをinterfaceで書くとQuaruts2で合成できないので普通にしている。。
試験的に書いてみた。(RTLはいつものcount4.svで)
注)pinをinterfaceで書くとQuaruts2で合成できないので普通にしている。。
module count4_4(input wire clk, input wire rst, input wire p, input wire t, input wire load, input wire [3:0] data, output wire [15:0] q_out, output wire [3:0] co_out, output logic [3:0] test ) ; logic [3:0] uu ; assign {uu[2:0], uu[3]} = 0 ; genvar i ; generate begin for(i=0;i<4;i++) begin : count_block count4 count4(.clk(clk), .rst(rst), .p(p), .t(t), .load(load), .data(data), .q(q_out[i*4+3:i*4]), .co(co_out[i]) ) ; end : count_block end endgenerate `ifdef PSL_TEST covergroup counter_cov @(posedge counter_if.clk) ; cp_qout : coverpoint counter_if.q iff (counter_if.load == 1'b0) { bins reset = {4'b0000} ; bins mid = {[1:14]} ; bins count_end = {4'b1111} ; } endgroup : counter_cov counter_cov counter_cov0 = new() ; `endif endmodule // counter_wrapper
結果count4のインスタンス名は
インスタンス名の中にあるcount_block[0]とかはforループのブロック名が付く
ここの仕様がIEEE1800-2009で決まったみたい。。
count4.count_block[i].count4 i<- 0~3とかになるのね!!
インスタンス名の中にあるcount_block[0]とかはforループのブロック名が付く
ここの仕様がIEEE1800-2009で決まったみたい。。
Quaruts2のRTL viewerで見ると
アルデックのシミュレータで見ると
アルデックのシミュレータで見ると
行数がMoneyに結び付かないときはgenerate文をバンバン使いましょ。。汗)
systemVerilog 回路設計 FPGA設計