FPGA開発日記

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

LiteXによるSoC環境構築を試行する (3. PLICのデバッグ)

https://raw.githubusercontent.com/enjoy-digital/litex/master/doc/litex.png

久しぶりに自作CPUのコアをLiteXに接続して、シミュレーション作業をしている。 FPGAの環境はどうにかなりつつあるので、シミュレーションでBIOSが動作するのを確認すれば、まずはなんとかなるんじゃないかなと思い作業中。

最終的にはキーボードからの入力を受け付けてコマンドを打てたりしてほしいのだが、まだそこまで言っていない。

PLICが割り込みをコアに通知して、それに応じてCLAIMレジスタを読むところまではちゃんと動いているようなのだが、ここから先がよく分からない。 無事にuart_isr()に飛んでいるようなのだが、ここから先はどのように処理すればいいのだろう? 引き続き解析が必要だ。

 void uart_isr(void)
 {
     unsigned int stat, rx_produce_next;

     stat = uart_ev_pending_read();

     if(stat & UART_EV_RX) {
         while(!uart_rxempty_read()) {
             rx_produce_next = (rx_produce + 1) & UART_RINGBUFFER_MASK_RX;
             if(rx_produce_next != rx_consume) {
                 rx_buf[rx_produce] = uart_rxtx_read();
                 rx_produce = rx_produce_next;
             }
             uart_ev_pending_write(UART_EV_RX);
             #if defined(__cva6__)
                 asm volatile("fence\n");
             #endif
         }
     }

     if(stat & UART_EV_TX) {
         uart_ev_pending_write(UART_EV_TX);
         while((tx_consume != tx_produce) && !uart_txfull_read()) {
             uart_rxtx_write(tx_buf[tx_consume]);
             tx_consume = (tx_consume + 1) & UART_RINGBUFFER_MASK_TX;
         }
     }
 }