FPGA開発日記

カテゴリ別記事インデックス https://msyksphinz.github.io/github_pages , English Version https://fpgadevdiary.hatenadiary.com/

LiteXでのFPGA論理合成環境を調査する (4. 自作CPUに環境を移植してみる、その4)

LiteXはSoCを半自動的に生成するための総合環境で、自作CPUのSoC生成環境もLiteXを使用している。

github.com

前回までで一応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)

msyksphinz.hatenablog.com

msyksphinz.hatenablog.com

msyksphinz.hatenablog.com