feat: add audio clock signals to RCU and Retrosoc ASIC, and implement related tests

This commit is contained in:
maksyuki committed 2026-08-21 11:09:24 +08:00
1 parent 805735e20d
commit e6e3a06136
6 files changed
+35 -3

No files matched your search

+1 -1
View File
@@ -1,2 +1,2 @@
APP_SRCS += $(ROOT_PATH)/app/network/userip/src/user_ip_demo.c
APP_INC_DIRS += $(ROOT_PATH)/app/network/userip/include
APP_INC_DIRS += $(ROOT_PATH)/app/network/userip/include
+1 -1
View File
@@ -213,4 +213,4 @@ firmware: $(FIRMWARE_ELF)
firmware asm: | manifest
.PHONY: FORCE_VERSION
.PHONY: FORCE_VERSION
+2
View File
@@ -22,6 +22,7 @@ module rcu #(
pll_ctrl_if.rcu pll_ctrl,
output logic sys_clk_o,
output logic sys_rst_n_o,
output logic aud_clk_o,
output logic aud_rst_n_o,
output logic sys_clkdiv4_o,
output logic timebase_tick_o
@@ -190,6 +191,7 @@ module rcu #(
);
assign sys_rst_n_o = s_sys_rst_n_sync;
assign aud_clk_o = s_aud_clk_buf;
assign aud_rst_n_o = s_aud_rst_n_sync;
assign sys_clkdiv4_o = s_sys_clkdiv4_q;
assign s_sys_reset_source_n = ext_rst_n_i && !wdg_reset_req_i;
+3 -1
View File
@@ -58,6 +58,7 @@ module retrosoc_asic (
);
logic s_ext_clk;
logic s_aud_clk;
logic s_aud_clk_buf;
logic s_sys_clkdiv4;
logic s_timebase_tick;
`ifdef HAVE_PLL
@@ -105,6 +106,7 @@ rcu #(
.pll_ctrl (u_pll_ctrl_if),
.sys_clk_o (s_sys_clk),
.sys_rst_n_o (s_sys_rst_n),
.aud_clk_o (s_aud_clk_buf),
.aud_rst_n_o (s_aud_rst_n),
.sys_clkdiv4_o (s_sys_clkdiv4),
.timebase_tick_o(s_timebase_tick)
@@ -120,7 +122,7 @@ rcu #(
retrosoc u_retrosoc (
.clk_i (s_sys_clk),
.rst_n_i (s_sys_rst_n),
.clk_aud_i (s_aud_clk),
.clk_aud_i (s_aud_clk_buf),
.rst_aud_n_i (s_aud_rst_n),
.clkdiv4_i (s_sys_clkdiv4),
.timebase_tick_i(s_timebase_tick),
+14
View File
@@ -12,6 +12,7 @@ module pll_ctrl_tb;
logic fault_reserved_i = 1'b0;
logic sys_clk_o;
logic sys_rst_n_o;
logic aud_clk_o;
logic aud_rst_n_o;
logic sys_clkdiv4_o;
apb4_if apb4 (
@@ -39,6 +40,7 @@ module pll_ctrl_tb;
.pll_ctrl (pll_ctrl),
.sys_clk_o (sys_clk_o),
.sys_rst_n_o (sys_rst_n_o),
.aud_clk_o (aud_clk_o),
.aud_rst_n_o (aud_rst_n_o),
.sys_clkdiv4_o (sys_clkdiv4_o),
.timebase_tick_o()
@@ -128,6 +130,18 @@ module pll_ctrl_tb;
sysctrl.rtc_wake_i = 1'b0;
#100;
rst_n_i = 1'b1;
repeat (2) begin
@(posedge aud_clk_i);
#1;
if (aud_clk_o !== 1'b1) begin
$fatal(1, "buffered audio clock did not follow a rising edge");
end
@(negedge aud_clk_i);
#1;
if (aud_clk_o !== 1'b0) begin
$fatal(1, "buffered audio clock did not follow a falling edge");
end
end
wait (aud_rst_n_o);
repeat (12) @(posedge sys_clk_o);
+14
View File
@@ -5,6 +5,7 @@ from __future__ import annotations
import hashlib
import io
import json
import re
import subprocess
import sys
import tarfile
@@ -16,6 +17,8 @@ DOMAINS = ROOT / "rtl/mini/integration/clock_reset_domains.json"
PIN_MAP = ROOT / "rtl/mini/pin_map/pin_map.json"
GENERATOR = ROOT / "physical/smoke/sta/opensta/generate_sdc.py"
OPENSTA_MAKEFILE = ROOT / "physical/smoke/sta/opensta/opensta.mk"
RCU = ROOT / "rtl/mini/top/rcu.sv"
RETROSOC_ASIC = ROOT / "rtl/mini/top/retrosoc_asic.sv"
GF180_GENERATOR = ROOT / "physical/pdk/generate_gf180_liberty.py"
ICS55_PREPARER = ROOT / "physical/pdk/prepare_ics55_liberty.py"
ICS55_SIM_MODEL_PREPARER = ROOT / "physical/pdk/prepare_ics55_sim_model.py"
@@ -59,6 +62,17 @@ def test_core_sdc_covers_current_clock_domains(tmp_path: Path) -> None:
assert "set_false_path -from $reset_ext_rst_n_i_pad" in sdc
def test_audio_sdc_root_drives_the_functional_audio_domain() -> None:
rcu = RCU.read_text(encoding="utf-8")
asic = RETROSOC_ASIC.read_text(encoding="utf-8")
assert re.search(r"\boutput\s+logic\s+aud_clk_o\b", rcu) is not None
assert re.search(r"\bassign\s+aud_clk_o\s*=\s*s_aud_clk_buf\s*;", rcu) is not None
assert re.search(r"\.aud_clk_o\s*\(s_aud_clk_buf\)", asic) is not None
assert re.search(r"\.clk_aud_i\s*\(s_aud_clk_buf\)", asic) is not None
assert re.search(r"\.clk_aud_i\s*\(s_aud_clk\)", asic) is None
def test_opensta_invocation_exits_after_a_tcl_error() -> None:
makefile = OPENSTA_MAKEFILE.read_text(encoding="utf-8")