(C) by T.IZUMI, Oct 2015
Ver. 2015.10.30.a
このくらい自力でインストールしなさい…、と言いたいところだが、ヒントを少し。
Synthesijer の合成をかけるだけなら JRE (Java Runtime Environment) だけあればOK。 JRE はウェブアプリを使っていると自動でインストールされていることが多い。 Java でのテストベンチのコンパイルなどには JDK (Java Software Development Kit)が必要。
変数名: | Path |
---|---|
変数値: | C:\Windows\System32;C:\Windows;C:\Windows\System32\Wbem;…コマンドパスが並ぶのでこれの最後に追加…;C:\Program Files\Java\jdk1.8.0_65\bin |
public class sjrtest { // public 変数を非同期入出力ポートとして使用 // 入力ポートは外部から常時書き込んでいるので、内部では書き込み禁止 public int sw; // register input !!!DON'T WRITE!!! public int ld; // register output public int time; // register input !!!DON'T WRITE!!! public int start_time; // register output public int end_time; // register output public int run(int n){ int t0,t1; int count; int i,j; t0=time; start_time=t0; count=0; for (i=0;i<n;i++) { count=count+sw+1; ld=count; } t1=time; end_time=t1; return count; } } |
public class sjrtest_tb { private static sjrtest m = new sjrtest(); public static void main(String[] args){ int n,c; int sw,ld,t,t0,t1; for (n=1;n<100;n++) { sw=n%8; t=n*100; m.sw=sw; m.time=t; c=m.run(n); ld=m.ld; t0=m.start_time; t1=m.end_time; System.out.printf ("sw=%02x t=%04x n=%02x c=%04x ld=%04x t0=%04x t1=%04x%n", sw,t,n,c,ld,t0,t1); } } } |
SYNTHESIJER_BASE = c:\\usr\\local\\synthesijer SYNTHESIJER_VERSION = 20151020 SYNTHESIJER = $(SYNTHESIJER_BASE)\\synthesijer_$(SYNTHESIJER_VERSION).jar SYNTHESIJER_LIB = $(SYNTHESIJER_BASE)\\synthesijer_lib_$(SYNTHESIJER_VERSION) SYNTHESIJER_EXTRA_LIB = $(SYNTHESIJER_BASE)\\synthesijer_extra-libs_$(SYNTHESIJER_VERSION) all: sjrtest_tb.log sjrtest.v sjrtest.v: sjrtest.java java -cp "$(SYNTHESIJER);." synthesijer.Main --verilog $< sim: sjrtest_tb.log sjrtest_tb.class: sjrtest_tb.java javac $< sjrtest_tb.log: sjrtest_tb.class java sjrtest_tb | tee $@ |
Tips: cygwinの表示文字コードの設定…cygwin端末を右クリック→Options→Text→Locale
Name sjrtest_prj Project Location 例 C:/cygwin/home/t-izumi/ZYBO_LED_SJR |
※public 変数に対応する _in,_we,_outの処理
【zybo_top.vより】 sjrtest sjrtest_i (.clk(clk), .sw_in(sjr_sw_in), .sw_we(1), //常時書込 .sw_out(), //読出不使用 .ld_in(0), //書込不使用 .ld_we(0), //書込不使用 .ld_out(sjr_ld_out), .time_in(sjr_time_in), .time_we(1), //常時書込 .time_out(), //読出不使用 .start_time_in(0), //書込不使用 .start_time_we(0), //書込不使用 .start_time_out(sjr_start_time_out), .end_time_in(0), //書込不使用 .end_time_we(0), //書込不使用 .end_time_out(sjr_end_time_out), .run_n(sjr_run_n), .run_return(sjr_run_return), .run_busy(sjr_run_busy), .run_req(sjr_run_req), .reset(~rstn)); |
ここでは、テストベンチとして Zynq PS とその GPIO ポートを用いる。
instance, port | 入力 | 出力 |
---|---|---|
gpio_0, port 1 | 時刻カウンタ | ‐ |
gpio_0, port 2 | ボタン、スイッチ | ‐ |
gpio_1, port 1 | method の busy | method の req |
gpio_1, port 2 | method の戻り値 | method の引数 |
gpio_2, port 1 | method 開始時刻 | ‐ |
gpio_2, port 2 | method 終了時刻 | ‐ |
※プロセッサをテストベンチとして使用するため、 クロック精度での反応ができない。 そこで req 信号は verilog側で1クロックのパルスに変換している。
【zybo_top.vより】 wire sjr_run_req_curr; reg sjr_run_req_prev=0; always @(posedge clk) sjr_run_req_prev<=(rstn)?sjr_run_req_curr:0; assign sjr_run_req=sjr_run_req_curr&~sjr_run_req_prev; |
※Synthesijer では AXI port に接続するためのライブラリもあるが、 ここでは素直な method 呼出そのものを確認するのが目的であり、 Zynq PS はあくまでもテストベンチであるため、 敢えてそれは使用しない。
実機デバッグでは、いったん論理合成を通してから、 観測したい信号やレジスタをマークし、 さらにデバッグ用のモジュールを設定登録する。 そして、再合成する。
(*1) ここで(画面B1)Netlistから信号やレジスタを右クリックして Mark Debug することもできる。しかし、ソースコード中の信号やレジスタは論理合成の最適化により名前が代わったり、縮退して消えてしまったりする。 また、 xdc ファイルの中で set_property MARK_DEBUG true [get_nets {uartrx/datao[*]}] などとすると予めマークできそうなものだが、それでも信号&名前の保存は保証されないようだ。
ソフトウェア開発のためにプロセッサシステムの情報をエクスポートする。
【sjrtest.cより】 counter=0; while(1){ pb1=XGpioPs_ReadPin(&gpiops,PB1_PIN); pb2=XGpioPs_ReadPin(&gpiops,PB2_PIN); led=(counter++&0x100000)?1:0; XGpioPs_WritePin(&gpiops,LED_PIN,led); if ((pb1_prev==0&&pb1==1)||(pb2_prev==0&&pb2==1)) { n=pb1?0x10000000:0x01000000; printf("run(%08x)\n",n); while ((*sjr_run_busy_p)==1){ led=(counter++&0x80000)?1:0; XGpioPs_WritePin(&gpiops,LED_PIN,led); } *sjr_run_n_p=n; *sjr_run_req_p=1;// req is filtered to be 1clk pulse in top.v *sjr_run_req_p=0; while ((*sjr_run_busy_p)==1){ led=(counter++&0x40000)?1:0; XGpioPs_WritePin(&gpiops,LED_PIN,led); } r=*sjr_run_return_p; t0=*sjr_start_time_p; t1=*sjr_end_time_p; t=t1-t0; printf("return = %08x\n",r); printf("start = %08x\n",t0); printf("end = %08x\n",t1); printf("time = %08x\n",t); } pb1_prev=pb1; pb2_prev=pb2; } |
Connection Type: Serial Port: Windows で ZYBO の USB Serial Port が接続されている番号を確認 Baud Rate: 115200 Data Bits: 8 Stop Bits: 1 Parity: None Flow Control: None Timeout: 5 |