LiteXはSoCを半自動的に生成するための総合環境で、自作CPUのSoC生成環境もLiteXを使用している。
前回までで一応Vivadoの論理合成は走り始めたのだが、dtsが作れずに最後まで完走しない。
調査すると、RISC-Vの構成の場合はCLINTとPLICのメモリマップを提供しないといけないようだった。
これは、自作CPUでサポートしているcore.py
でPLICとCLINTを明示的に定義することで解決できるようだった。
ただし、以下の実装では外部からCLINTとPLICを読めるように定義しておらず、いろいろと問題がある。
本当はちゃんと接続しないと駄目だろう。
@@ -80,8 +104,8 @@ class ScariV(CPU): "sram" : 0x2000_0000, "main_sram" : 0x4000_0000, "csr" : 0xf000_0000, - "clint" : 0x0200_0000, - "plic" : 0x0c00_0000, + "clint" : 0xf200_0000, + "plic" : 0xfc00_0000, } def __init__(self, platform, variant="standard"): @@ -200,10 +224,21 @@ class ScariV(CPU): ) - def add_soc_components(self, soc, soc_region_cls): + def add_soc_components(self, soc): # Define ISA. soc.add_constant("LITEX_SIMULATION", 1) + soc.add_constant("RV_AMO", 1) + soc.add_constant("RV64", 1) + + # Add PLIC Bus (AXILite Slave). + self.plicbus = plicbus = axi.AXILiteInterface(address_width=32, data_width=32) + soc.bus.add_slave("plic", self.plicbus, region=SoCRegion(origin=soc.mem_map.get("plic"), size=0x40_0000, cached=False)) + + # Add CLINT Bus (AXILite Slave). + self.clintbus = clintbus = axi.AXILiteInterface(address_width=32, data_width=32) + soc.bus.add_slave("clint", clintbus, region=SoCRegion(origin=soc.mem_map.get("clint"), size=0x1_0000, cached=False)) + self.soc = soc # FIXME: Save SoC instance to retrieve the final mem layout on finalization. def set_reset_address(self, reset_address): self.reset_address = reset_address
一応ここまでで、ZCU104をターゲットとしたVivadoでの論理合成が完了した。レポートもちゃんと生成された。
./make.py --board=zcu104 --build
以下が論理合成時のDelayだ。-2.045ns
とかなり多きな遅延になってしまっている。
Max Delay Paths -------------------------------------------------------------------------------------- Slack (VIOLATED) : -2.045ns (required time - arrival time) Source: scariv_subsystem_axi_wrapper/u_scariv_subsystem/u_tile/u_frontend/u_scariv_inst_buffer/u_inst_queue/r_outptr_reg[1]_rep__1/C (rising edge-triggered cell FDCE clocked by sys_clk {rise@0.000ns fall@4.000ns period=8.000ns}) Destination: scariv_subsystem_axi_wrapper/u_scariv_subsystem/u_tile/u_frontend/r_s1_tlb_except_cause_reg[0]/D (rising edge-triggered cell FDRE clocked by sys_clk {rise@0.000ns fall@4.000ns period=8.000ns}) Path Group: sys_clk Path Type: Setup (Max at Slow Process Corner) Requirement: 8.000ns (sys_clk rise@8.000ns - sys_clk rise@0.000ns) Data Path Delay: 10.130ns (logic 2.584ns (25.508%) route 7.546ns (74.492%)) Logic Levels: 42 (CARRY8=2 LUT2=6 LUT3=3 LUT4=3 LUT5=4 LUT6=19 MUXF7=2 MUXF8=2 RAMD32=1) Clock Path Skew: 0.117ns (DCD - SCD + CPR) Destination Clock Delay (DCD): 6.557ns = ( 14.557 - 8.000 ) Source Clock Delay (SCD): 6.284ns Clock Pessimism Removal (CPR): -0.155ns Clock Uncertainty: 0.057ns ((TSJ^2 + DJ^2)^1/2) / 2 + PE Total System Jitter (TSJ): 0.071ns Discrete Jitter (DJ): 0.091ns Phase Error (PE): 0.000ns
また、Route後のDelayは以下のようになった。これもまた大きい。
Max Delay Paths -------------------------------------------------------------------------------------- Slack (VIOLATED) : -1.527ns (required time - arrival time) Source: scariv_subsystem_axi_wrapper/u_scariv_subsystem/u_tile/u_frontend/u_scariv_inst_buffer/u_inst_queue/r_outptr_reg[0]_rep/C (rising edge-triggered cell FDCE clocked by sys_clk {rise@0.000ns fall@4.000ns period=8.000ns}) Destination: scariv_subsystem_axi_wrapper/u_scariv_subsystem/u_tile/u_frontend/r_s1_tlb_except_cause_reg[0]/D (rising edge-triggered cell FDRE clocked by sys_clk {rise@0.000ns fall@4.000ns period=8.000ns}) Path Group: sys_clk Path Type: Setup (Max at Slow Process Corner) Requirement: 8.000ns (sys_clk rise@8.000ns - sys_clk rise@0.000ns) Data Path Delay: 9.716ns (logic 3.771ns (38.812%) route 5.945ns (61.188%)) Logic Levels: 40 (CARRY8=4 LUT1=1 LUT2=5 LUT3=3 LUT5=2 LUT6=20 MUXF7=2 MUXF8=2 RAMD32=1) Clock Path Skew: 0.221ns (DCD - SCD + CPR) Destination Clock Delay (DCD): 6.705ns = ( 14.705 - 8.000 ) Source Clock Delay (SCD): 6.307ns Clock Pessimism Removal (CPR): -0.177ns Clock Uncertainty: 0.057ns ((TSJ^2 + DJ^2)^1/2) / 2 + PE Total System Jitter (TSJ): 0.071ns Discrete Jitter (DJ): 0.091ns Phase Error (PE): 0.000ns Clock Net Delay (Source): 2.954ns (routing 1.722ns, distribution 1.232ns) Clock Net Delay (Destination): 3.011ns (routing 1.566ns, distribution 1.445ns)