ã©ããã§ãã
æ¯å¹´æä¾ã®ãã®ææããã£ã¦ãã¾ãã
qiita.com
æå¤ã¨æ
å ±ãåºã¦ããªããªã»ã»ã»ã»ã¨ãããã¨ã§å°ãæ¸ãã¦ã¿ããã¨ã«ãã¾ããã
ModelSim/Questaã®GUIå®è¡ã£ã¦é¢åããã
ãã¦ãçæ§ãFPGAã®RTLã·ãã¥ã¬ã¼ã·ã§ã³ãããã¨ãã«ä½ã使ç¨ããã¦ããã§ããããï¼
ãªã©ããããããã¾ããããããã®å¤§å¤ãªã¨ããã¯ãVerilogã¨VHDLãçµã¿åãããã·ãã¥ã¬ã¼ã·ã§ã³ãã§ããªããç¹ã§ãï¼ããããéè¦ããã®ãï¼ã¨ãã話ã¯ãã¦ããã»ã»ã»ï¼ã
æ··åã·ãã¥ã¬ã¼ã·ã§ã³ãå®è¡å¯è½ã§ãç¡æã§å
¥æå¯è½ãªã·ãã¥ã¬ã¼ã¿ã¯ä»¥ä¸3ã¤ã«ãªãã¨æãã¾ãã
- Questa - Intel FPGA Starter Edition
- xsimï¼AMD Vivadoã«ä»å±ï¼
- Aldec Active-HDL Student Editionï¼å¦çã®ã¿ï¼
ãã®ä¸ã§ã·ãã¥ã¬ã¼ã¿ãåç¬èµ·åã§ãã社ä¼äººã§ã使ç¨å¯è½ãªãã®ã¯Questa - Intel FPGA Starter Editionã®ã¿ã§ãã
ããããQuestaãIntelãä¸ããGUIã§å®è¡ãããã¨ããã¨
- ããã¸ã§ã¯ãã®ä½æ
- ã¢ã¸ã¥ã¼ã«ã¨ãã¹ããã³ãã®ã¤ã³ãã¼ã
- ã³ã³ãã¤ã«
- ã·ãã¥ã¬ã¼ã·ã§ã³è¨å®
- ã·ãã¥ã¬ã¼ã·ã§ã³å®è¡
ããã¦ã¹ã使ã£ã¦ããããããå¿
è¦ããããçµæ§æéãé£ãã¾ãã
www.paltek.co.jp
ã¨ãããã¨ã§ãå¹çããã·ãã¥ã¬ã¼ã·ã§ã³ãå®è¡ããããã«ã¯Verilatorçã®ããã«ã³ãã³ãã©ã¤ã³ã§è¡ããã¨ãæ¬ ããã¾ããã
ãããå®è¡
Questaã§ã·ãã¥ã¬ã¼ã·ã§ã³ãè¡ãã«ãããã³ãã³ããä¸è¡ä¸è¡æã£ã¦ãè¯ãã®ã§ããããã¡ããVerilatorçã¨æ¯è¼ããã¨æé ãå¤ãã§ãã
- ã·ãã¥ã¬ã¼ã·ã§ã³ç¨ã¯ã¼ãã³ã°ãã£ã¬ã¯ããªã®ä½æ
- ãããã³ã°
- ã³ã³ãã¤ã«
- ã·ãã¥ã¬ã¼ã·ã§ã³éå§
- ã·ãã¥ã¬ã¼ã·ã§ã³ã»ãã°è¨å®
- å®è¡
ã¨ãããã¨ã§ãä¸è¬çã«ããããä¸ããã³ãã³ãã§è¡ããã¨ã¯ã»ã¨ãã©ãªããããããã¡ã¤ã«ãä½æãã¦è¡ããã¨ãä¸è¬çã§ãã
ããããã¡ã¤ã«ä½æ
ã¨ãããã¨ã§ãããã§ã¯ãã£ããã¨ããããã¡ã¤ã«ã«ã¾ã¨ããã³ãã³ããç´¹ä»ãã¾ãã
詳細ãªèª¬æã¯ä»¥ä¸ãªã³ã¯å
ã«ãããã¾ãã®ã§ããã²ãåç
§ãã ããã
www.paltek.co.jp
ãªããããã§ã¯ããã¸ã§ã¯ãå
¨ä½ã§ã¯ãªããæ¯è¼çå°è¦æ¨¡ãªã¢ã¸ã¥ã¼ã«ã§ã®ã·ãã¥ã¬ã¼ã·ã§ã³ãæ³å®ãã¦ç´¹ä»ãã¾ãã
ã·ãã¥ã¬ã¼ã·ã§ã³ç¨ã®ã¯ã¼ãã³ã°ãã£ã¬ã¯ããªãä½æãã¾ãã
OSæ¨æºã³ãã³ãã§ã®ä½æã¯ã§ãã¾ããã®ã§ã注æãã ããã
åºæ¬çã«ã¯ãworkãã¨ããåã®ãã£ã¬ã¯ããªãä½æãããã¨ãä¸è¬çã§ãã
vlib work
è«çã©ã¤ãã©ãªã¨ã¯ã¼ãã³ã°ãã£ã¬ã¯ããªããããã³ã°ãã¾ãã
åºæ¬çã«ã©ã¤ãã©ãªåã¨ãã£ã¬ã¯ããªåãåããã¦ããã¨æ··ä¹±ã¯èµ·ããªãã¨æãã¾ãã
vmap work work
ãããå°ã大å¤ã§ãã
Verilogã¨VHDLã§ã³ã³ãã¤ã«ã®ã³ãã³ããç°ãªã£ãããè¨èªãã¼ã¸ã§ã³ã«ãã£ã¦ã¯ã³ãã³ããªãã·ã§ã³ãå¿
è¦ã«ãªã£ãããã¾ãã
ã¾ããè¤æ°ã®ãã£ã¬ã¯ããªãvlibããã³vmapã§ä½æãã¦ããå ´åã¯æå®ãã¦ä¸ããå¿
è¦ãããã¾ãã
ãªãã·ã§ã³ãå
¥ããªãå ´åãVerolog-2001ã¨ãã¦ã³ã³ãã¤ã«ããã¾ãã
vlog [-vlog95compat|-vlog01compat] hoge.v
SystemVerilog
æ¡å¼µåsvã®å ´åã¯-svãªãã·ã§ã³ã¯ä¸è¦ã§ãã
vlog [-sv] fuga.sv
ãªãã·ã§ã³ãå
¥ããªãå ´åã¯VHDL-2002ã¨ãã¦ã³ã³ãã¤ã«ããã¾ãã
vcom [-87|-97|-2002|-2008] hogefuga.vhd
ã·ãã¥ã¬ã¼ã·ã§ã³ï¼vsimï¼
-cãªãã·ã§ã³ã§ãããå®è¡ã¢ã¼ãã¨ãªãã¾ãï¼-cãªãã·ã§ã³ãä»ããªãå ´åãGUIã¦ã£ã³ãã¦ãèµ·åãã¾ãï¼ã
-tã§ã·ãã¥ã¬ã¼ã·ã§ã³ã®åä½æéãæå®ãã¾ãã
-doã®å¾ã§ã·ãã¥ã¬ã¼ã·ã§ã³ã®ç´°ããè¨å®ãå
¥ãã¦ããã¾ãã
ããã§ã¯"wave.do"ã¨ãããã¡ã¤ã«ã®ä¸èº«ã«ç´°ããå
容ãè¨è¼ãã¾ãã
vsim -c -t ns -do "do wave.do; run -all;"
波形確èª
vsimã-cãªãã·ã§ã³ã¨å
±ã«å®è¡ããã¨GUIãèµ·åããªãããããã¨ãã波形ãã¡ã¤ã«ãéãã¦ç¢ºèªããå ´åãããã¾ãã
ãã®éã¯vsimã³ãã³ãã®å¾ã«æ³¢å½¢ãã¡ã¤ã«(*.wlf)ãã¡ã¤ã«ãæå®ããã°ããã§ããåºæ¬çã«ã¯"vsim.wlf"ã«ãªãã¾ãã
vsim vsim.wlf
doãã¡ã¤ã«ã®ä¸èº«
doãã¡ã¤ã«ã®ä¸èº«ã¯ã·ãã¥ã¬ã¼ã·ã§ã³éå§å¾ã®è¨å®ï¼æ³¢å½¢è¡¨ç¤ºããä¿¡å·ããã°ãåãä¿¡å·ãªã©ï¼ãæ¸ãã¦ããã¾ãã
add log
観測ããä¿¡å·ãæå®ãã¾ããããã«å
¥ã£ã¦ããªãä¿¡å·ã¯ã·ãã¥ã¬ã¼ã·ã§ã³å®äºå¾ã®æ³¢å½¢è¦³æ¸¬ãä¿¡å·ã®å¤åã追跡ã§ãã¾ããã
add log {/top/module/signal}
-rãªãã·ã§ã³ãä»ãããã¨ã§æå®ããé層以ä¸ã®å
¨ã¦ã®ä¿¡å·ã®è¦³æ¸¬ããããã¨ãã§ãã¾ãã大è¦æ¨¡ãªã·ãã¥ã¬ã¼ã·ã§ã³ã§ã¯å®è¡é度ãé
ããªãã¾ãã®ã§æ³¨æãå¿
è¦ã§ãã
ä¾ãã°ã以ä¸ã³ãã³ãã§ãã¹ããã³ãå«ããå
¨ã¦ã®ä¿¡å·ã観測ã§ãã¾ãã
add log -r *
add wave
QuestaãGUIèµ·åããå ´åã¯add waveã³ãã³ãã§æ³¢å½¢è¡¨ç¤ºããä¿¡å·ãæå®ãã¦ããã¨è¯ãã§ãã
add wave {/top/module/signal}
å®éã«ãã£ã¦ã¿ã
ããã§çè
ãæ®æ®µãã£ã¦ãæ¹æ³ã§ã·ãã¥ã¬ã¼ã·ã§ã³ããã£ã¦ã¿ã¾ãã
ç°¡åãªãã¦ã³ã«ã¦ã³ã¿ããã¼ãã«ãã¦ã¿ã¾ãã
ç°å¢ã¯Windowsã«ãªãã¾ãã
Linuxã§å®è¡ããå ´åã¯æ¡å¼µå".bat"ã".sh"ã«ããã°åãã¨æãã¾ãã
ã¢ã¸ã¥ã¼ã«æ¬ä½ï¼CNT_DOWN.svï¼
`default_nettype none
module CNT_DOWN #(
  parameter int unsigned BIT_WIDTH = 4
) (
  input  bit CLK_I ,
  input  bit NRST_I,
  output logic signed [BIT_WIDTH - 1:0] CNT
);
  logic signed [BIT_WIDTH - 1:0] CNT_REG = {(BIT_WIDTH){1'b0}};
  always_ff @( posedge CLK_I ) begin: blk_cnt
    if (!NRST_I) begin
      CNT_REG <= {(BIT_WIDTH){1'b0}};
    end else begin
      CNT_REG <= CNT_REG - 1'b1;
    end
  end
  assign CNT = CNT_REG;
endmodule
ãã¹ããã³ãï¼CNT_DOWN_tb.svï¼
`default_nettype none
`timescale 1ns/1ps
module CNT_DOWN_tb ();
  localparam int unsigned BIT_WIDTH = 4;
  logic CLK_I = 1'b0;
  logic NRST_I = 1'b1;
  logic signed [BIT_WIDTH - 1:0] CNT;
  CNT_DOWN #(
    .BIT_WIDTH(BIT_WIDTH)
  ) u0 (
    .CLK_I(CLK_I),
    .NRST_I(NRST_I),
    .CNT(CNT)
  );
  initial begin
    $dumpfile("CNT_DOWN.vcd");
    $dumpvars(0, CNT_DOWN_tb);
    #23 NRST_I = 1'b0;
    #14 NRST_I = 1'b1;
    #100 $finish();
  end
  always begin: blk_genclk
    #2 CLK_I <= ~CLK_I;
  end
endmodule
ããããã¡ã¤ã«ï¼CNT_DOWN.batï¼
GUIãåºãã¦æ³¢å½¢è¡¨ç¤ºã¾ã§ãããã®ã§ãvsimã«-cãªãã·ã§ã³ã¯ä»ãã¦ãã¾ããã
ã¾ããæé©åãªãã·ã§ã³ããããã°ãªãã·ã§ã³ï¼-voptargs=+accã-debugdb=+accï¼ãä»å ãã¦ãã¾ãã
vlib work
vmap work work
vsim -t ns -voptargs=+acc -debugdb=+acc work.CNT_DOWN_tb -do "do wave.do; run -all;"
doãã¡ã¤ã«ï¼wave.doï¼
add log -r *
Â
add wave {/CNT_DOWN_tb/u0/CLK_I}
add wave {/CNT_DOWN_tb/u0/NRST_I}
add wave {/CNT_DOWN_tb/u0/CNT_I}
以ä¸4ã¤ã®ãã¡ã¤ã«ãåä¸ãã£ã¬ã¯ããªã«ä¿åããããããã¡ã¤ã«ãå®è¡ãã¦ãã ããã
以ä¸ã®ãããªã¡ãã»ã¼ã¸ã表示ããã¾ãããããããããã¯ãªãã¯ãã¦ãã ããã
ãã¯ãããé¸æããã¨ã½ããã¦ã§ã¢ãçµäºãã¦ãã¾ãã¾ãã

ããã¨æ³¢å½¢ã表示ãããç¶æ
ã§GUIãæä½å¯è½ã«ãªãã¾ãã
ãã¨ã¯Radixãããã£ããã»ã»ã»

RTLã®ãããã¯ã確èªãããã»ã»ã»

èªç±èªå¨ã§ããå人çã«ãã®ãGUIã§ãããã確èªã§ãããããªç¶æ
ã«ããã¾ã§ããããããã¡ã¤ã«ã§èªååããã¨ä¸æºåã®ã»ã¨ãã©ãæ¯åããå¿
è¦ããªããªããé常ã«ä¾¿å©ã¨æãã¾ãã