update reports
This commit is contained in:
Binary file not shown.
@@ -60,7 +60,7 @@
|
|||||||
\fontsize{14pt}{22pt}\selectfont
|
\fontsize{14pt}{22pt}\selectfont
|
||||||
报告类型:\uline{\hfill 后端设计实践报告\hfill} \\[18pt]
|
报告类型:\uline{\hfill 后端设计实践报告\hfill} \\[18pt]
|
||||||
参赛杯赛:\uline{\hfill 龙芯中科杯\hfill} \\[18pt]
|
参赛杯赛:\uline{\hfill 龙芯中科杯\hfill} \\[18pt]
|
||||||
作品名称:\uline{\hfill 基于龙芯SoC的后量子密码与矩阵运算加速系统芯片后端设计\hfill} \\[18pt]
|
作品名称:\uline{\hfill 基于LoongArch SoC 的后量子密码与矩阵运算加速系统\hfill} \\[18pt]
|
||||||
队伍编号:\uline{\hfill CICC1008439\hfill} \\[18pt]
|
队伍编号:\uline{\hfill CICC1008439\hfill} \\[18pt]
|
||||||
团队名称:\uline{\hfill 碳基生物\hfill}
|
团队名称:\uline{\hfill 碳基生物\hfill}
|
||||||
\end{flushleft}
|
\end{flushleft}
|
||||||
|
|||||||
28
doc/reports/defense/README.md
Normal file
28
doc/reports/defense/README.md
Normal file
@@ -0,0 +1,28 @@
|
|||||||
|
# 答辩材料
|
||||||
|
|
||||||
|
本目录包含十分钟系统设计答辩材料:
|
||||||
|
|
||||||
|
- `ppt_template.pptx`:大赛官方答辩模板,生成时作为母版使用。
|
||||||
|
- `defense_presentation.pptx`:18页主讲内容、1页结束页和3页答疑备用内容。
|
||||||
|
- `defense_presentation.pdf`:用于快速审阅排版的导出版本。
|
||||||
|
- `defense_speech.md`:逐页演讲稿、时间分配和常见追问速答。
|
||||||
|
- `build_defense_ppt.py`:可重复生成PPTX的脚本。
|
||||||
|
|
||||||
|
当前数据基线为系统设计报告 evidence `d456463`,日期为2026-07-15。Matmul最终评测完成5000组运算,用时4.911765 ms,CRC32 `0x0417d761`匹配,得分100.00%。PPT保留官方模板的母版、主题、背景素材和嵌入字体。
|
||||||
|
|
||||||
|
重新生成PPTX需要Python 3、`python-pptx`和Pillow:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
python3 -m pip install python-pptx Pillow
|
||||||
|
python3 doc/reports/defense/build_defense_ppt.py
|
||||||
|
```
|
||||||
|
|
||||||
|
可使用LibreOffice生成审阅PDF:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
libreoffice --headless --convert-to pdf \
|
||||||
|
--outdir doc/reports/defense \
|
||||||
|
doc/reports/defense/defense_presentation.pptx
|
||||||
|
```
|
||||||
|
|
||||||
|
更新性能数据时,需要同时修改系统报告指标、PPT生成脚本和演讲稿,以保持证据口径一致。
|
||||||
863
doc/reports/defense/build_defense_ppt.py
Normal file
863
doc/reports/defense/build_defense_ppt.py
Normal file
@@ -0,0 +1,863 @@
|
|||||||
|
#!/usr/bin/env python3
|
||||||
|
"""Build the defense deck from the official CICIEC PPT template."""
|
||||||
|
|
||||||
|
from __future__ import annotations
|
||||||
|
|
||||||
|
import sys
|
||||||
|
from io import BytesIO
|
||||||
|
from pathlib import Path
|
||||||
|
from zipfile import ZipFile
|
||||||
|
|
||||||
|
try:
|
||||||
|
from pptx import Presentation
|
||||||
|
except ModuleNotFoundError:
|
||||||
|
sys.path.insert(0, "/tmp/codex_pptx")
|
||||||
|
from pptx import Presentation
|
||||||
|
|
||||||
|
from PIL import Image
|
||||||
|
from pptx.dml.color import RGBColor
|
||||||
|
from pptx.enum.shapes import MSO_SHAPE
|
||||||
|
from pptx.enum.text import MSO_ANCHOR, PP_ALIGN
|
||||||
|
from pptx.util import Inches, Pt
|
||||||
|
|
||||||
|
|
||||||
|
ROOT = Path(__file__).resolve().parents[3]
|
||||||
|
HERE = Path(__file__).resolve().parent
|
||||||
|
SYSTEM = ROOT / "doc/reports/system"
|
||||||
|
MLKEM = ROOT / "doc/reports/mlkem_ip"
|
||||||
|
TEMPLATE = HERE / "ppt_template.pptx"
|
||||||
|
OUTPUT = HERE / "defense_presentation.pptx"
|
||||||
|
|
||||||
|
W = 13.333
|
||||||
|
H = 7.5
|
||||||
|
|
||||||
|
# Template typefaces and palette.
|
||||||
|
FONT = "HarmonyOS Sans SC"
|
||||||
|
TITLE_FONT = "Alimama ShuHeiTi Bold"
|
||||||
|
LATIN_FONT = "Arial"
|
||||||
|
INK = "202533"
|
||||||
|
MUTED = "667085"
|
||||||
|
BLUE = "142DA8"
|
||||||
|
ACCENT_BLUE = "4874CB"
|
||||||
|
ORANGE = "EE822F"
|
||||||
|
YELLOW = "F2BA02"
|
||||||
|
GREEN = "75BD42"
|
||||||
|
TEAL = "30C0B4"
|
||||||
|
RED = "E54C5E"
|
||||||
|
WHITE = "FFFFFF"
|
||||||
|
PALE_BLUE = "EDF3FF"
|
||||||
|
PALE_ORANGE = "FFF3E9"
|
||||||
|
PALE_TEAL = "EAF9F7"
|
||||||
|
PALE_GRAY = "F5F7FA"
|
||||||
|
LINE = "D7DEEA"
|
||||||
|
|
||||||
|
|
||||||
|
def color(value: str) -> RGBColor:
|
||||||
|
return RGBColor.from_string(value)
|
||||||
|
|
||||||
|
|
||||||
|
with ZipFile(TEMPLATE) as archive:
|
||||||
|
MEDIA = {
|
||||||
|
name.rsplit("/", 1)[-1]: archive.read(name)
|
||||||
|
for name in archive.namelist()
|
||||||
|
if name.startswith("ppt/media/") and not name.endswith("/")
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
prs = Presentation(str(TEMPLATE))
|
||||||
|
while len(prs.slides):
|
||||||
|
sld_id = prs.slides._sldIdLst[0]
|
||||||
|
prs.part.drop_rel(sld_id.rId)
|
||||||
|
del prs.slides._sldIdLst[0]
|
||||||
|
blank = prs.slide_layouts[6]
|
||||||
|
|
||||||
|
|
||||||
|
def add_template_image(slide, media_name, x, y, w, h):
|
||||||
|
return slide.shapes.add_picture(
|
||||||
|
BytesIO(MEDIA[media_name]), Inches(x), Inches(y), Inches(w), Inches(h)
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
def add_rect(slide, x, y, w, h, fill=WHITE, line=None, radius=False):
|
||||||
|
shape_type = MSO_SHAPE.ROUNDED_RECTANGLE if radius else MSO_SHAPE.RECTANGLE
|
||||||
|
shape = slide.shapes.add_shape(shape_type, Inches(x), Inches(y), Inches(w), Inches(h))
|
||||||
|
shape.fill.solid()
|
||||||
|
shape.fill.fore_color.rgb = color(fill)
|
||||||
|
if line:
|
||||||
|
shape.line.color.rgb = color(line)
|
||||||
|
shape.line.width = Pt(1)
|
||||||
|
else:
|
||||||
|
shape.line.fill.background()
|
||||||
|
if radius:
|
||||||
|
try:
|
||||||
|
shape.adjustments[0] = 0.06
|
||||||
|
except Exception:
|
||||||
|
pass
|
||||||
|
return shape
|
||||||
|
|
||||||
|
|
||||||
|
def add_text(
|
||||||
|
slide,
|
||||||
|
text,
|
||||||
|
x,
|
||||||
|
y,
|
||||||
|
w,
|
||||||
|
h,
|
||||||
|
size=17,
|
||||||
|
fill=INK,
|
||||||
|
bold=False,
|
||||||
|
font=FONT,
|
||||||
|
align=PP_ALIGN.LEFT,
|
||||||
|
valign=MSO_ANCHOR.TOP,
|
||||||
|
margin=0.02,
|
||||||
|
line_spacing=1.05,
|
||||||
|
):
|
||||||
|
shape = slide.shapes.add_textbox(Inches(x), Inches(y), Inches(w), Inches(h))
|
||||||
|
frame = shape.text_frame
|
||||||
|
frame.clear()
|
||||||
|
frame.margin_left = frame.margin_right = Inches(margin)
|
||||||
|
frame.margin_top = frame.margin_bottom = Inches(margin)
|
||||||
|
frame.vertical_anchor = valign
|
||||||
|
para = frame.paragraphs[0]
|
||||||
|
para.text = text
|
||||||
|
para.alignment = align
|
||||||
|
para.space_after = Pt(0)
|
||||||
|
para.line_spacing = line_spacing
|
||||||
|
para.font.name = font
|
||||||
|
para.font.size = Pt(size)
|
||||||
|
para.font.bold = bold
|
||||||
|
para.font.color.rgb = color(fill)
|
||||||
|
return shape
|
||||||
|
|
||||||
|
|
||||||
|
def add_rich(slide, runs, x, y, w, h, align=PP_ALIGN.LEFT):
|
||||||
|
shape = slide.shapes.add_textbox(Inches(x), Inches(y), Inches(w), Inches(h))
|
||||||
|
frame = shape.text_frame
|
||||||
|
frame.clear()
|
||||||
|
frame.margin_left = frame.margin_right = Inches(0.02)
|
||||||
|
frame.margin_top = frame.margin_bottom = Inches(0.02)
|
||||||
|
para = frame.paragraphs[0]
|
||||||
|
para.alignment = align
|
||||||
|
for text, size, bold, fill, font in runs:
|
||||||
|
run = para.add_run()
|
||||||
|
run.text = text
|
||||||
|
run.font.name = font
|
||||||
|
run.font.size = Pt(size)
|
||||||
|
run.font.bold = bold
|
||||||
|
run.font.color.rgb = color(fill)
|
||||||
|
return shape
|
||||||
|
|
||||||
|
|
||||||
|
def add_bullets(slide, items, x, y, w, h, size=15, fill=INK, gap=5, accent=BLUE):
|
||||||
|
shape = slide.shapes.add_textbox(Inches(x), Inches(y), Inches(w), Inches(h))
|
||||||
|
frame = shape.text_frame
|
||||||
|
frame.clear()
|
||||||
|
frame.margin_left = frame.margin_right = Inches(0.02)
|
||||||
|
frame.margin_top = frame.margin_bottom = Inches(0.02)
|
||||||
|
for index, item in enumerate(items):
|
||||||
|
para = frame.paragraphs[0] if index == 0 else frame.add_paragraph()
|
||||||
|
para.text = "• " + item
|
||||||
|
para.font.name = FONT
|
||||||
|
para.font.size = Pt(size)
|
||||||
|
para.font.color.rgb = color(fill)
|
||||||
|
para.space_after = Pt(gap)
|
||||||
|
para.line_spacing = 1.06
|
||||||
|
return shape
|
||||||
|
|
||||||
|
|
||||||
|
def add_arrow(slide, x, y, w, h, fill=BLUE):
|
||||||
|
shape = slide.shapes.add_shape(MSO_SHAPE.RIGHT_ARROW, Inches(x), Inches(y), Inches(w), Inches(h))
|
||||||
|
shape.fill.solid()
|
||||||
|
shape.fill.fore_color.rgb = color(fill)
|
||||||
|
shape.line.fill.background()
|
||||||
|
return shape
|
||||||
|
|
||||||
|
|
||||||
|
def add_line(slide, x, y, w, h=0.02, fill=LINE):
|
||||||
|
return add_rect(slide, x, y, w, h, fill)
|
||||||
|
|
||||||
|
|
||||||
|
def add_image_contain(slide, path: Path, x, y, w, h, frame=True):
|
||||||
|
if frame:
|
||||||
|
add_rect(slide, x - 0.03, y - 0.03, w + 0.06, h + 0.06, WHITE, LINE)
|
||||||
|
with Image.open(path) as image:
|
||||||
|
iw, ih = image.size
|
||||||
|
scale = min(w / iw, h / ih)
|
||||||
|
pw, ph = iw * scale, ih * scale
|
||||||
|
return slide.shapes.add_picture(
|
||||||
|
str(path), Inches(x + (w - pw) / 2), Inches(y + (h - ph) / 2), Inches(pw), Inches(ph)
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
def set_cell(cell, text, size=12, bold=False, fill=INK, bg=None, align=PP_ALIGN.LEFT):
|
||||||
|
if bg:
|
||||||
|
cell.fill.solid()
|
||||||
|
cell.fill.fore_color.rgb = color(bg)
|
||||||
|
frame = cell.text_frame
|
||||||
|
frame.clear()
|
||||||
|
frame.margin_left = frame.margin_right = Inches(0.07)
|
||||||
|
frame.margin_top = frame.margin_bottom = Inches(0.03)
|
||||||
|
frame.vertical_anchor = MSO_ANCHOR.MIDDLE
|
||||||
|
para = frame.paragraphs[0]
|
||||||
|
para.text = text
|
||||||
|
para.alignment = align
|
||||||
|
para.font.name = LATIN_FONT if "seed" in text else FONT
|
||||||
|
para.font.size = Pt(size)
|
||||||
|
para.font.bold = bold
|
||||||
|
para.font.color.rgb = color(fill)
|
||||||
|
|
||||||
|
|
||||||
|
def add_table(slide, rows, x, y, w, h, widths=None, size=12):
|
||||||
|
shape = slide.shapes.add_table(len(rows), len(rows[0]), Inches(x), Inches(y), Inches(w), Inches(h))
|
||||||
|
table = shape.table
|
||||||
|
if widths:
|
||||||
|
for index, width in enumerate(widths):
|
||||||
|
table.columns[index].width = Inches(width)
|
||||||
|
for r, row in enumerate(rows):
|
||||||
|
for c, value in enumerate(row):
|
||||||
|
set_cell(
|
||||||
|
table.cell(r, c),
|
||||||
|
value,
|
||||||
|
size=size,
|
||||||
|
bold=r == 0,
|
||||||
|
fill=WHITE if r == 0 else INK,
|
||||||
|
bg=BLUE if r == 0 else (PALE_GRAY if r % 2 == 0 else WHITE),
|
||||||
|
align=PP_ALIGN.CENTER if c else PP_ALIGN.LEFT,
|
||||||
|
)
|
||||||
|
return table
|
||||||
|
|
||||||
|
|
||||||
|
def add_metric(slide, value, label, x, y, w, accent=BLUE, suffix=""):
|
||||||
|
add_rich(
|
||||||
|
slide,
|
||||||
|
[(value, 24, True, accent, TITLE_FONT), (suffix, 13, False, accent, LATIN_FONT)],
|
||||||
|
x,
|
||||||
|
y,
|
||||||
|
w,
|
||||||
|
0.45,
|
||||||
|
PP_ALIGN.CENTER,
|
||||||
|
)
|
||||||
|
add_text(slide, label, x, y + 0.48, w, 0.45, 11, MUTED, align=PP_ALIGN.CENTER)
|
||||||
|
|
||||||
|
|
||||||
|
def add_number_badge(slide, number, x, y, fill=BLUE):
|
||||||
|
add_rect(slide, x, y, 0.47, 0.47, fill, radius=True)
|
||||||
|
add_text(slide, number, x, y + 0.08, 0.47, 0.22, 12, WHITE, True, font=LATIN_FONT, align=PP_ALIGN.CENTER)
|
||||||
|
|
||||||
|
|
||||||
|
def new_content_slide(title, number, subtitle=None):
|
||||||
|
slide = prs.slides.add_slide(blank)
|
||||||
|
add_template_image(slide, "image1.png", 0, 0, W, H)
|
||||||
|
add_template_image(slide, "image2.png", 0.28, -0.02, 1.82, 1.12)
|
||||||
|
add_text(slide, title, 2.4, 0.48, 8.55, 0.55, 24, BLUE, True, TITLE_FONT, PP_ALIGN.CENTER)
|
||||||
|
add_rect(slide, 6.17, 1.17, 0.98, 0.07, ORANGE)
|
||||||
|
if subtitle:
|
||||||
|
add_text(slide, subtitle, 10.9, 0.53, 1.9, 0.28, 9.5, MUTED, align=PP_ALIGN.RIGHT)
|
||||||
|
add_text(slide, str(number), 12.35, 6.98, 0.72, 0.3, 9, MUTED, font=LATIN_FONT, align=PP_ALIGN.LEFT)
|
||||||
|
return slide
|
||||||
|
|
||||||
|
|
||||||
|
def new_preview_slide(number, label):
|
||||||
|
slide = prs.slides.add_slide(blank)
|
||||||
|
add_template_image(slide, "image1.png", 0, 0, W, H)
|
||||||
|
add_template_image(slide, "image2.png", 0.3, -0.02, 1.82, 1.12)
|
||||||
|
add_text(slide, "作品重要亮点预览页", 3.2, 0.48, 6.95, 0.56, 25, BLUE, True, TITLE_FONT, PP_ALIGN.CENTER)
|
||||||
|
add_rect(slide, 6.17, 1.17, 0.98, 0.07, ORANGE)
|
||||||
|
add_text(slide, label, 10.85, 0.53, 1.95, 0.28, 10, ORANGE, True, align=PP_ALIGN.RIGHT)
|
||||||
|
add_text(slide, str(number), 12.35, 6.98, 0.72, 0.3, 9, MUTED, font=LATIN_FONT, align=PP_ALIGN.LEFT)
|
||||||
|
return slide
|
||||||
|
|
||||||
|
|
||||||
|
# 1. Cover
|
||||||
|
slide = prs.slides.add_slide(blank)
|
||||||
|
add_template_image(slide, "image3.png", 0, 0, W, H)
|
||||||
|
add_template_image(slide, "image4.png", 5.93, 0.65, 1.48, 1.48)
|
||||||
|
add_text(slide, "第十届全国大学生集成电路创新创业大赛", 1.15, 2.2, 11.05, 0.48, 24, BLUE, True, TITLE_FONT, PP_ALIGN.CENTER)
|
||||||
|
add_text(slide, "基于龙芯SoC的后量子密码与矩阵运算加速系统", 1.1, 2.82, 11.15, 0.78, 30, BLUE, True, TITLE_FONT, PP_ALIGN.CENTER)
|
||||||
|
add_rect(slide, 4.2, 3.9, 4.93, 0.62, BLUE, radius=True)
|
||||||
|
add_text(slide, "龙芯中科杯 · 系统设计答辩", 4.33, 4.05, 4.67, 0.26, 16, WHITE, True, align=PP_ALIGN.CENTER)
|
||||||
|
add_text(slide, "作品编号:CICC1008439 · 团队:碳基生物", 4.25, 5.25, 4.85, 0.34, 13, INK, True, align=PP_ALIGN.CENTER)
|
||||||
|
add_text(slide, "证据版本 d456463 · 2026-07-15", 4.4, 5.72, 4.55, 0.3, 11, MUTED, align=PP_ALIGN.CENTER)
|
||||||
|
|
||||||
|
|
||||||
|
# 2. Team introduction
|
||||||
|
slide = new_content_slide("团队介绍:围绕完整系统形成协同分工", 2, "团队与项目")
|
||||||
|
add_text(slide, "团队名称:碳基生物", 0.88, 1.48, 4.2, 0.36, 16, BLUE, True)
|
||||||
|
roles = [
|
||||||
|
(0.82, BLUE, PALE_BLUE, "系统架构与SoC集成", ["OpenLA500平台集成", "AXI、DMA与多时钟域", "SRAM控制器优化"]),
|
||||||
|
(4.52, TEAL, PALE_TEAL, "密码算法与RTL实现", ["全参数ML-KEM架构", "Keccak、NTT与多项式算子", "常量时间解封装"]),
|
||||||
|
(8.22, ORANGE, PALE_ORANGE, "软件验证、测试与文档", ["板级驱动与测试程序", "分层仿真和证据采集", "系统报告与答辩材料"]),
|
||||||
|
]
|
||||||
|
for x, accent, pale, title, items in roles:
|
||||||
|
add_rect(slide, x, 2.08, 3.35, 3.72, pale, accent, radius=True)
|
||||||
|
add_text(slide, title, x + 0.18, 2.38, 2.99, 0.36, 17, accent, True, TITLE_FONT, PP_ALIGN.CENTER)
|
||||||
|
add_bullets(slide, items, x + 0.32, 3.12, 2.72, 1.85, size=13, gap=10)
|
||||||
|
add_rect(slide, 1.0, 6.18, 11.15, 0.55, PALE_GRAY, LINE)
|
||||||
|
add_text(slide, "以统一接口、可重复测试和版本化证据贯通硬件、软件与文档。", 1.2, 6.34, 10.75, 0.24, 13, INK, True, align=PP_ALIGN.CENTER)
|
||||||
|
|
||||||
|
|
||||||
|
# 3. Contents
|
||||||
|
slide = prs.slides.add_slide(blank)
|
||||||
|
add_template_image(slide, "image3.png", 0, 0, W, H)
|
||||||
|
add_text(slide, "目录", 0.82, 0.48, 1.6, 0.55, 29, BLUE, True, TITLE_FONT)
|
||||||
|
add_text(slide, "CONTENTS", 0.91, 1.15, 1.5, 0.22, 11, MUTED, font=LATIN_FONT)
|
||||||
|
contents = [
|
||||||
|
("1", "项目与系统方案", "开发过程、设计目标与系统数据流", BLUE),
|
||||||
|
("2", "自主计算IP", "Matmul流水与全参数ML-KEM", ORANGE),
|
||||||
|
("3", "验证与实现结果", "分层验证、资源时序与最终性能", TEAL),
|
||||||
|
("4", "心得与后续工作", "工程认识、设计取舍与优化路线", GREEN),
|
||||||
|
]
|
||||||
|
for i, (num, title, sub, accent) in enumerate(contents):
|
||||||
|
y = 1.75 + i * 1.2
|
||||||
|
add_rect(slide, 2.25, y, 0.58, 0.58, accent)
|
||||||
|
add_text(slide, num, 2.25, y + 0.13, 0.58, 0.24, 15, WHITE, True, align=PP_ALIGN.CENTER)
|
||||||
|
add_text(slide, title, 3.18, y - 0.02, 4.35, 0.34, 17, INK, True)
|
||||||
|
add_text(slide, sub, 3.18, y + 0.42, 5.1, 0.3, 12, MUTED)
|
||||||
|
|
||||||
|
|
||||||
|
# 4. Preview: architecture and contributions
|
||||||
|
slide = new_preview_slide(4, "系统方案")
|
||||||
|
add_rect(slide, 0.78, 1.52, 7.75, 4.8, WHITE, LINE)
|
||||||
|
add_image_contain(slide, SYSTEM / "system_arch.png", 0.94, 1.7, 7.43, 4.45, frame=False)
|
||||||
|
add_text(slide, "OpenLA500 + DMA数据面 + 三个自主计算IP", 0.95, 6.4, 7.4, 0.3, 13, BLUE, True, align=PP_ALIGN.CENTER)
|
||||||
|
highlights = [
|
||||||
|
("01", "硬件自治", "五千组 Matmul 任务一次启动完成", BLUE),
|
||||||
|
("02", "存储优化", "SRAM连续突发达到1 beat/cycle", ORANGE),
|
||||||
|
("03", "全参数密码", "单比特流覆盖三等级、三操作", TEAL),
|
||||||
|
("04", "异步协同", "三时钟域通过全五通道AXI FIFO连接", GREEN),
|
||||||
|
]
|
||||||
|
for i, (num, title, desc, accent) in enumerate(highlights):
|
||||||
|
y = 1.62 + i * 1.18
|
||||||
|
add_number_badge(slide, num, 8.85, y, accent)
|
||||||
|
add_text(slide, title, 9.48, y - 0.02, 2.55, 0.3, 15, accent, True)
|
||||||
|
add_text(slide, desc, 9.48, y + 0.37, 2.85, 0.48, 11.5, INK)
|
||||||
|
add_rect(slide, 8.78, 6.25, 3.72, 0.58, PALE_BLUE, BLUE)
|
||||||
|
add_text(slide, "全系统 0 DSP · 三时钟域零违例", 8.92, 6.42, 3.44, 0.24, 12, BLUE, True, align=PP_ALIGN.CENTER)
|
||||||
|
|
||||||
|
|
||||||
|
# 5. Preview: measured results
|
||||||
|
slide = new_preview_slide(5, "关键结果")
|
||||||
|
metrics = [
|
||||||
|
("4.911765", "Matmul 5000组最终时间", BLUE, " ms"),
|
||||||
|
("827.80", "FFT DMA相对软件加速", ORANGE, "×"),
|
||||||
|
("48.95–53.33", "ML-KEM DMA相对软件加速", TEAL, "×"),
|
||||||
|
("0", "DSP48E1使用量", GREEN, " DSP"),
|
||||||
|
]
|
||||||
|
for i, (value, label, accent, suffix) in enumerate(metrics):
|
||||||
|
x = 0.72 + i * 3.12
|
||||||
|
add_rect(slide, x, 1.62, 2.77, 1.2, WHITE, accent, radius=True)
|
||||||
|
add_metric(slide, value, label, x + 0.12, 1.77, 2.53, accent, suffix)
|
||||||
|
add_table(
|
||||||
|
slide,
|
||||||
|
[
|
||||||
|
["验证对象", "测试规模", "结果"],
|
||||||
|
["ML-KEM主路径KAT", "3等级 × 3操作 × 1000", "9000 / 9000"],
|
||||||
|
["Decaps隐式拒绝", "3等级 × 100", "300 / 300"],
|
||||||
|
["ML-KEM板级诊断", "3等级 × 3路径 × 100", "900次零失败"],
|
||||||
|
["Matmul最终评测", "5000组 · seed a3772ec8", "4.911765 ms · 满分"],
|
||||||
|
["FFT板级验证", "CPU / DMA各3次", "误差Re=1、Im=2"],
|
||||||
|
],
|
||||||
|
0.92,
|
||||||
|
3.18,
|
||||||
|
7.2,
|
||||||
|
3.05,
|
||||||
|
widths=[2.25, 2.9, 2.05],
|
||||||
|
size=11.5,
|
||||||
|
)
|
||||||
|
add_rect(slide, 8.5, 3.18, 3.88, 3.05, PALE_ORANGE, ORANGE, radius=True)
|
||||||
|
add_text(slide, "实现质量", 8.82, 3.48, 3.2, 0.34, 18, ORANGE, True, TITLE_FONT, PP_ALIGN.CENTER)
|
||||||
|
add_metric(slide, "55,066", "Slice LUT · 41.16%", 8.85, 4.04, 1.45, BLUE)
|
||||||
|
add_metric(slide, "29.5", "BRAM Tile · 8.08%", 10.48, 4.04, 1.45, TEAL)
|
||||||
|
add_metric(slide, "88,843", "时序端点", 8.85, 5.2, 1.45, GREEN)
|
||||||
|
add_metric(slide, "+0.070", "全系统最小WNS / ns", 10.48, 5.2, 1.45, ORANGE)
|
||||||
|
|
||||||
|
|
||||||
|
# 6. Development process
|
||||||
|
slide = new_content_slide("开发过程:以端到端证据驱动迭代", 6, "项目与系统方案")
|
||||||
|
stages = [
|
||||||
|
("1", "基础SoC跑通", "完成处理器取指、串口及总线外设联调", BLUE),
|
||||||
|
("2", "计算IP接入", "实现Matmul、CRC32、FFT与全参数ML-KEM", TEAL),
|
||||||
|
("3", "数据通路优化", "引入DMA端点、双Bank调度和SRAM连续突发", ORANGE),
|
||||||
|
("4", "时钟与复位收敛", "完成PLL分域、AXI CDC和复位顺序验证", GREEN),
|
||||||
|
("5", "分层验证闭环", "建立叶模块、IP、SoC与板级四层证据", BLUE),
|
||||||
|
("6", "最终性能迭代", "压缩启动与稳态空闲,Matmul评测达到100分", ORANGE),
|
||||||
|
]
|
||||||
|
for i, (num, title, desc, accent) in enumerate(stages):
|
||||||
|
col, row = i % 3, i // 3
|
||||||
|
x, y = 0.78 + col * 4.12, 1.55 + row * 2.35
|
||||||
|
add_rect(slide, x, y, 3.68, 1.75, WHITE, accent, radius=True)
|
||||||
|
add_number_badge(slide, num, x + 0.2, y + 0.25, accent)
|
||||||
|
add_text(slide, title, x + 0.88, y + 0.23, 2.55, 0.3, 15, accent, True)
|
||||||
|
add_text(slide, desc, x + 0.25, y + 0.82, 3.18, 0.68, 11.2, INK, align=PP_ALIGN.CENTER)
|
||||||
|
if i < 2 or 3 <= i < 5:
|
||||||
|
add_arrow(slide, x + 3.75, y + 0.74, 0.25, 0.17, accent)
|
||||||
|
add_rect(slide, 1.0, 6.35, 11.15, 0.44, PALE_TEAL, TEAL)
|
||||||
|
add_text(slide, "每轮迭代同时检查功能正确性、总线可观测性、时序与板级端到端时间。", 1.22, 6.48, 10.7, 0.2, 12.5, INK, True, align=PP_ALIGN.CENTER)
|
||||||
|
|
||||||
|
|
||||||
|
# 7. Contest requirements
|
||||||
|
slide = new_content_slide("赛题要求与设计响应", 7, "项目与系统方案")
|
||||||
|
add_text(slide, "赛题不是孤立IP设计,而是完整SoC中的端到端实现。", 0.82, 1.48, 8.3, 0.34, 13, MUTED)
|
||||||
|
add_table(
|
||||||
|
slide,
|
||||||
|
[
|
||||||
|
["赛题要求 / 工程约束", "本系统的设计响应"],
|
||||||
|
["基于OpenLA500构建完整SoC", "双主八从AXI架构;CPU、系统、ML-KEM三个异步时钟域"],
|
||||||
|
["5000组4×4矩阵乘法,禁止DSP", "全LUT乘加、双Bank序列器、在线CRC32与快速通道"],
|
||||||
|
["实现FIPS 203 ML-KEM", "单比特流覆盖三等级、三操作;KAT与隐式拒绝验证"],
|
||||||
|
["提高端到端性能", "四通道DMA、端点传输、SRAM连续突发与硬件自主调度"],
|
||||||
|
],
|
||||||
|
0.85,
|
||||||
|
1.98,
|
||||||
|
11.6,
|
||||||
|
3.85,
|
||||||
|
widths=[4.0, 7.6],
|
||||||
|
size=13,
|
||||||
|
)
|
||||||
|
add_rect(slide, 0.9, 6.15, 11.5, 0.58, PALE_TEAL, TEAL)
|
||||||
|
add_text(slide, "答辩主线:赛题约束 → 系统架构 → 数据流与自主IP → 分层验证 → 实测结果", 1.1, 6.32, 11.1, 0.24, 14, INK, True, align=PP_ALIGN.CENTER)
|
||||||
|
|
||||||
|
|
||||||
|
# 8. Architecture and ownership
|
||||||
|
slide = new_content_slide("总体架构与自主设计边界", 8, "项目与系统方案")
|
||||||
|
add_image_contain(slide, SYSTEM / "system_arch.png", 0.7, 1.48, 8.0, 5.15)
|
||||||
|
add_rect(slide, 9.02, 1.5, 3.45, 3.78, WHITE, TEAL, radius=True)
|
||||||
|
add_text(slide, "自主实现", 9.25, 1.78, 3.0, 0.34, 18, TEAL, True, TITLE_FONT, PP_ALIGN.CENTER)
|
||||||
|
add_bullets(
|
||||||
|
slide,
|
||||||
|
[
|
||||||
|
"四通道DMA与加速器端点",
|
||||||
|
"Matmul、批量序列器、CRC32",
|
||||||
|
"1024点Radix-2² SDF FFT",
|
||||||
|
"全参数ML-KEM硬件IP",
|
||||||
|
"两级AXI跨时钟域桥",
|
||||||
|
"SRAM控制器突发流水化",
|
||||||
|
],
|
||||||
|
9.28,
|
||||||
|
2.35,
|
||||||
|
2.95,
|
||||||
|
2.55,
|
||||||
|
size=13.2,
|
||||||
|
gap=5,
|
||||||
|
)
|
||||||
|
add_rect(slide, 9.02, 5.5, 3.45, 1.1, PALE_GRAY, LINE, radius=True)
|
||||||
|
add_text(slide, "赛事基础平台", 9.25, 5.72, 2.95, 0.28, 14, MUTED, True, align=PP_ALIGN.CENTER)
|
||||||
|
add_text(slide, "OpenLA500、板级SRAM器件、UART及基础外设", 9.25, 6.08, 2.95, 0.36, 11, INK, align=PP_ALIGN.CENTER)
|
||||||
|
|
||||||
|
|
||||||
|
# 9. Data movement, clocks and SRAM
|
||||||
|
slide = new_content_slide("数据搬运、SRAM与三时钟域协同", 9, "项目与系统方案")
|
||||||
|
clock_info = [
|
||||||
|
(0.8, BLUE, "CPU域 · 33.333 MHz", "OpenLA500 / Cache / AXI主端"),
|
||||||
|
(5.0, TEAL, "系统域 · 50 MHz", "Crossbar / DMA / SRAM / Matmul / FFT"),
|
||||||
|
(9.2, ORANGE, "ML-KEM域 · 76.923 MHz", "AXI前端 / Keccak / NTT / FSM"),
|
||||||
|
]
|
||||||
|
for x, accent, title, desc in clock_info:
|
||||||
|
add_rect(slide, x, 1.5, 3.3, 0.85, WHITE, accent, radius=True)
|
||||||
|
add_text(slide, title, x + 0.1, 1.68, 3.1, 0.28, 13.5, accent, True, align=PP_ALIGN.CENTER)
|
||||||
|
add_text(slide, desc, x + 0.1, 2.02, 3.1, 0.2, 9.5, MUTED, align=PP_ALIGN.CENTER)
|
||||||
|
add_arrow(slide, 4.26, 1.78, 0.5, 0.25, BLUE)
|
||||||
|
add_arrow(slide, 8.46, 1.78, 0.5, 0.25, TEAL)
|
||||||
|
add_text(slide, "AXI双时钟FIFO", 3.84, 2.34, 1.35, 0.2, 9, MUTED, align=PP_ALIGN.CENTER)
|
||||||
|
add_text(slide, "AXI双时钟FIFO", 8.04, 2.34, 1.35, 0.2, 9, MUTED, align=PP_ALIGN.CENTER)
|
||||||
|
|
||||||
|
add_rect(slide, 0.82, 2.85, 5.7, 3.45, WHITE, BLUE, radius=True)
|
||||||
|
add_text(slide, "硬件数据通路", 1.05, 3.08, 5.2, 0.3, 17, BLUE, True, TITLE_FONT, PP_ALIGN.CENTER)
|
||||||
|
flow = [("CPU配置", BLUE), ("DMA", TEAL), ("ExtRAM", YELLOW), ("加速器", ORANGE)]
|
||||||
|
x = 1.05
|
||||||
|
for index, (name, accent) in enumerate(flow):
|
||||||
|
add_rect(slide, x, 3.72, 1.03, 0.58, PALE_GRAY, accent)
|
||||||
|
add_text(slide, name, x, 3.88, 1.03, 0.22, 11, accent, True, align=PP_ALIGN.CENTER)
|
||||||
|
if index < 3:
|
||||||
|
add_arrow(slide, x + 1.08, 3.9, 0.35, 0.18, accent)
|
||||||
|
x += 1.43
|
||||||
|
add_text(slide, "CPU只配置任务,DMA、SRAM与加速器完成批量搬运和计算。", 1.02, 4.65, 5.25, 0.5, 12, INK, align=PP_ALIGN.CENTER)
|
||||||
|
add_text(slide, "复位顺序:sys → mlkem → cpu;释放前AXI valid保持为0。", 1.02, 5.42, 5.25, 0.38, 11, MUTED, align=PP_ALIGN.CENTER)
|
||||||
|
|
||||||
|
add_rect(slide, 6.82, 2.85, 5.65, 3.45, WHITE, ORANGE, radius=True)
|
||||||
|
add_text(slide, "SRAM连续突发优化", 7.05, 3.08, 5.2, 0.3, 17, ORANGE, True, TITLE_FONT, PP_ALIGN.CENTER)
|
||||||
|
add_text(slide, "优化前", 7.12, 3.63, 0.75, 0.24, 10.5, MUTED, True)
|
||||||
|
for i in range(4):
|
||||||
|
accent = BLUE if i % 2 == 0 else "E3E7EF"
|
||||||
|
add_rect(slide, 8.08 + i * 0.72, 3.58, 0.42, 0.36, accent)
|
||||||
|
add_text(slide, "优化后", 7.12, 4.18, 0.75, 0.24, 10.5, ORANGE, True)
|
||||||
|
for i in range(4):
|
||||||
|
add_rect(slide, 8.08 + i * 0.48, 4.13, 0.42, 0.36, TEAL)
|
||||||
|
add_metric(slide, "200", "理论单向带宽", 7.15, 4.82, 2.0, ORANGE, " MB/s")
|
||||||
|
add_metric(slide, "1", "无反压连续读写", 9.52, 4.82, 2.0, TEAL, " beat/cycle")
|
||||||
|
add_text(slide, "读数据寄存保持R通道稳定;Bank选择随事务锁存。", 7.12, 5.9, 5.0, 0.32, 11, INK, align=PP_ALIGN.CENTER)
|
||||||
|
|
||||||
|
|
||||||
|
# 10. Matmul
|
||||||
|
slide = new_content_slide("Matmul:一次启动完成5000组流水任务", 10, "自主计算IP")
|
||||||
|
add_image_contain(slide, SYSTEM / "matmul_dataflow_gantt.png", 0.65, 1.5, 9.55, 5.3)
|
||||||
|
add_rect(slide, 10.45, 1.5, 2.02, 5.3, WHITE, BLUE, radius=True)
|
||||||
|
add_text(slide, "关键节拍", 10.65, 1.78, 1.62, 0.3, 17, BLUE, True, TITLE_FONT, PP_ALIGN.CENTER)
|
||||||
|
for y, value, label, accent in [
|
||||||
|
(2.26, "128 B", "每组A/B读取", BLUE),
|
||||||
|
(3.18, "≈22 cyc", "单Bank乘加延迟", GREEN),
|
||||||
|
(4.10, "2×6 B", "每元素CRC更新", ORANGE),
|
||||||
|
(5.02, "0 B", "快速模式结果写回", TEAL),
|
||||||
|
]:
|
||||||
|
add_text(slide, value, 10.66, y, 1.62, 0.3, 18, accent, True, TITLE_FONT, PP_ALIGN.CENTER)
|
||||||
|
add_text(slide, label, 10.66, y + 0.34, 1.62, 0.26, 10, MUTED, align=PP_ALIGN.CENTER)
|
||||||
|
add_text(slide, "最后一组退休后仍等待CRC FIFO排空,再产生DONE。", 10.7, 6.03, 1.55, 0.5, 10.5, INK, align=PP_ALIGN.CENTER)
|
||||||
|
|
||||||
|
|
||||||
|
# 11. ML-KEM architecture
|
||||||
|
slide = new_content_slide("ML-KEM:单比特流覆盖三等级与三操作", 11, "自主计算IP")
|
||||||
|
add_image_contain(slide, MLKEM / "mlkem_modules.png", 0.65, 1.48, 8.05, 4.8)
|
||||||
|
add_rect(slide, 9.0, 1.5, 3.45, 3.95, WHITE, TEAL, radius=True)
|
||||||
|
add_text(slide, "运行时配置", 9.25, 1.8, 2.95, 0.3, 18, TEAL, True, TITLE_FONT, PP_ALIGN.CENTER)
|
||||||
|
add_metric(slide, "3", "512 / 768 / 1024", 9.27, 2.28, 1.3, TEAL)
|
||||||
|
add_metric(slide, "3", "KeyGen / Encaps / Decaps", 10.78, 2.28, 1.35, ORANGE)
|
||||||
|
add_bullets(
|
||||||
|
slide,
|
||||||
|
[
|
||||||
|
"参数在start时锁存",
|
||||||
|
"存储按KMAX=4静态分配",
|
||||||
|
"控制、算子、BRAM三级组织",
|
||||||
|
"公钥/私钥/密文支持AXI突发窗口",
|
||||||
|
"无需按安全等级重新综合",
|
||||||
|
],
|
||||||
|
9.28,
|
||||||
|
3.38,
|
||||||
|
2.95,
|
||||||
|
1.72,
|
||||||
|
size=11.8,
|
||||||
|
gap=4,
|
||||||
|
)
|
||||||
|
add_rect(slide, 0.82, 6.36, 11.47, 0.46, PALE_TEAL, TEAL)
|
||||||
|
add_text(slide, "KeyGen 生成 ek/dk", 1.45, 6.49, 2.45, 0.2, 12, BLUE, True, align=PP_ALIGN.CENTER)
|
||||||
|
add_arrow(slide, 4.02, 6.5, 0.48, 0.17, BLUE)
|
||||||
|
add_text(slide, "Encaps 生成 c/ss", 4.62, 6.49, 2.45, 0.2, 12, TEAL, True, align=PP_ALIGN.CENTER)
|
||||||
|
add_arrow(slide, 7.18, 6.5, 0.48, 0.17, TEAL)
|
||||||
|
add_text(slide, "Decaps 恢复或拒绝 ss", 7.78, 6.49, 3.05, 0.2, 12, ORANGE, True, align=PP_ALIGN.CENTER)
|
||||||
|
|
||||||
|
|
||||||
|
# 12. ML-KEM key designs
|
||||||
|
slide = new_content_slide("ML-KEM关键设计:复用、并行与常量时间", 12, "自主计算IP")
|
||||||
|
panels = [
|
||||||
|
(0.72, BLUE, PALE_BLUE, "共享Keccak"),
|
||||||
|
(4.52, TEAL, PALE_TEAL, "双蝶形NTT"),
|
||||||
|
(8.32, ORANGE, PALE_ORANGE, "Decaps复用"),
|
||||||
|
]
|
||||||
|
for x, accent, pale, title in panels:
|
||||||
|
add_rect(slide, x, 1.55, 3.5, 4.95, pale, accent, radius=True)
|
||||||
|
add_text(slide, title, x + 0.2, 1.84, 3.1, 0.34, 18, accent, True, TITLE_FONT, PP_ALIGN.CENTER)
|
||||||
|
|
||||||
|
# Shared Keccak panel
|
||||||
|
for i, name in enumerate(["G/H/J哈希", "SampleNTT", "CBD采样"]):
|
||||||
|
add_rect(slide, 0.98, 2.55 + i * 0.62, 1.15, 0.38, WHITE, LINE)
|
||||||
|
add_text(slide, name, 0.98, 2.66 + i * 0.62, 1.15, 0.16, 9.5, INK, align=PP_ALIGN.CENTER)
|
||||||
|
add_arrow(slide, 2.22, 2.67 + i * 0.62, 0.36, 0.16, BLUE)
|
||||||
|
add_rect(slide, 2.65, 2.83, 1.25, 1.0, WHITE, BLUE)
|
||||||
|
add_text(slide, "单一\nKeccak-f[1600]", 2.72, 3.08, 1.12, 0.45, 11, BLUE, True, align=PP_ALIGN.CENTER)
|
||||||
|
add_text(slide, "避免两份额外实例\n约节省10.6k LUT", 1.05, 4.85, 2.82, 0.6, 13, BLUE, True, align=PP_ALIGN.CENTER)
|
||||||
|
|
||||||
|
# NTT panel
|
||||||
|
add_rect(slide, 4.92, 2.6, 1.1, 1.3, WHITE, TEAL)
|
||||||
|
for i in range(4):
|
||||||
|
add_rect(slide, 5.08, 2.75 + i * 0.24, 0.78, 0.14, TEAL if i % 2 == 0 else ACCENT_BLUE)
|
||||||
|
add_arrow(slide, 6.15, 3.08, 0.4, 0.2, TEAL)
|
||||||
|
add_rect(slide, 6.65, 2.6, 1.08, 1.3, WHITE, TEAL)
|
||||||
|
add_text(slide, "BU0\nBU1", 6.72, 2.99, 0.94, 0.42, 14, TEAL, True, align=PP_ALIGN.CENTER)
|
||||||
|
add_text(slide, "4路BRAM无冲突供数\n读-算-写三级调度", 4.95, 4.28, 2.75, 0.58, 12, INK, align=PP_ALIGN.CENTER)
|
||||||
|
add_text(slide, "4 coeff/cycle · 0 DSP", 4.98, 5.14, 2.72, 0.32, 15, TEAL, True, align=PP_ALIGN.CENTER)
|
||||||
|
|
||||||
|
# Decaps panel
|
||||||
|
for i, (name, accent) in enumerate([("D1–D5 解密恢复", BLUE), ("D6 复用Encaps", TEAL), ("D7 常量时间比较", ORANGE)]):
|
||||||
|
add_rect(slide, 8.7, 2.5 + i * 0.82, 2.75, 0.5, WHITE, accent)
|
||||||
|
add_text(slide, name, 8.82, 2.64 + i * 0.82, 2.51, 0.2, 11, accent, True, align=PP_ALIGN.CENTER)
|
||||||
|
if i < 2:
|
||||||
|
down = slide.shapes.add_shape(MSO_SHAPE.DOWN_ARROW, Inches(9.88), Inches(3.04 + i * 0.82), Inches(0.38), Inches(0.2))
|
||||||
|
down.fill.solid(); down.fill.fore_color.rgb = color(accent); down.line.fill.background()
|
||||||
|
add_text(slide, "Accept与Reject路径\n总周期数完全相等", 8.86, 5.25, 2.44, 0.52, 13, ORANGE, True, align=PP_ALIGN.CENTER)
|
||||||
|
|
||||||
|
add_text(slide, "设计取舍:以资源共享和运行时可配置性换取更低的面积与部署复杂度。", 1.0, 6.68, 11.3, 0.28, 13, INK, True, align=PP_ALIGN.CENTER)
|
||||||
|
|
||||||
|
|
||||||
|
# 13. Verification
|
||||||
|
slide = new_content_slide("四层验证:从算子正确到板级闭环", 13, "验证与实现结果")
|
||||||
|
bands = [
|
||||||
|
(1.55, 1.35, 8.25, "板级系统", "真实FPGA、CPU软件、DMA与串口日志", ORANGE),
|
||||||
|
(2.55, 1.95, 7.05, "SoC集成", "AXI解码、CDC、复位释放、SRAM取指", TEAL),
|
||||||
|
(3.55, 2.55, 5.85, "IP集成", "Matmul / FFT / DMA / ML-KEM端到端", BLUE),
|
||||||
|
(4.55, 3.15, 4.65, "叶模块", "Keccak、NTT、蝶形、FIFO、CRC32", GREEN),
|
||||||
|
]
|
||||||
|
for y, x, width, title, desc, accent in bands:
|
||||||
|
add_rect(slide, x, y, width, 0.7, WHITE, accent, radius=True)
|
||||||
|
add_text(slide, title, x + 0.18, y + 0.17, 1.2, 0.24, 13, accent, True)
|
||||||
|
add_text(slide, desc, x + 1.45, y + 0.16, width - 1.65, 0.26, 11.5, INK, align=PP_ALIGN.CENTER)
|
||||||
|
add_rect(slide, 9.88, 1.55, 2.5, 4.75, PALE_ORANGE, ORANGE, radius=True)
|
||||||
|
add_text(slide, "验证结果", 10.15, 1.82, 1.96, 0.3, 17, ORANGE, True, TITLE_FONT, PP_ALIGN.CENTER)
|
||||||
|
for i, (value, label, accent) in enumerate([
|
||||||
|
("9000", "主路径KAT", BLUE),
|
||||||
|
("300", "隐式拒绝向量", ORANGE),
|
||||||
|
("900", "ML-KEM板级运行", TEAL),
|
||||||
|
("100%", "Matmul最终得分", GREEN),
|
||||||
|
("6", "FFT板级测试", YELLOW),
|
||||||
|
]):
|
||||||
|
y = 2.28 + i * 0.76
|
||||||
|
add_text(slide, value, 10.05, y, 0.95, 0.28, 16, accent, True, TITLE_FONT, PP_ALIGN.RIGHT)
|
||||||
|
add_text(slide, label, 11.12, y + 0.03, 1.05, 0.26, 10, INK)
|
||||||
|
add_rect(slide, 1.0, 5.75, 8.55, 0.58, PALE_TEAL, TEAL)
|
||||||
|
add_text(slide, "算法逐字节比对;板级以零失败、CRC匹配和误差阈值为判据。", 1.18, 5.92, 8.2, 0.24, 12.5, INK, True, align=PP_ALIGN.CENTER)
|
||||||
|
add_text(slide, "全部通过", 9.98, 6.48, 2.25, 0.36, 20, GREEN, True, TITLE_FONT, PP_ALIGN.CENTER)
|
||||||
|
|
||||||
|
|
||||||
|
# 14. Resources and timing
|
||||||
|
slide = new_content_slide("实现结果:资源可控,三个时钟域全部收敛", 14, "验证与实现结果")
|
||||||
|
add_rect(slide, 0.78, 1.5, 5.72, 4.85, WHITE, BLUE, radius=True)
|
||||||
|
add_text(slide, "FPGA资源利用", 1.05, 1.78, 5.18, 0.3, 17, BLUE, True, TITLE_FONT, PP_ALIGN.CENTER)
|
||||||
|
resource_data = [
|
||||||
|
("Slice LUT", 41.16, "55,066", BLUE),
|
||||||
|
("Registers", 11.58, "31,000", TEAL),
|
||||||
|
("BRAM Tile", 8.08, "29.5", YELLOW),
|
||||||
|
("DSP48E1", 0.0, "0", ORANGE),
|
||||||
|
]
|
||||||
|
for i, (label, percent, absolute, accent) in enumerate(resource_data):
|
||||||
|
y = 2.45 + i * 0.75
|
||||||
|
add_text(slide, label, 1.02, y, 1.1, 0.24, 11, INK)
|
||||||
|
add_rect(slide, 2.2, y + 0.02, 2.55, 0.22, "E5E9F1")
|
||||||
|
if percent:
|
||||||
|
add_rect(slide, 2.2, y + 0.02, 2.55 * percent / 50, 0.22, accent)
|
||||||
|
add_text(slide, f"{percent:.2f}%", 4.85, y - 0.02, 0.68, 0.26, 10.5, accent, True, align=PP_ALIGN.RIGHT)
|
||||||
|
add_text(slide, absolute, 5.6, y - 0.02, 0.55, 0.26, 10, MUTED, align=PP_ALIGN.RIGHT)
|
||||||
|
add_text(slide, "xc7a200tfbg676-1 · 布局布线100%完成", 1.1, 5.72, 5.08, 0.28, 11.5, MUTED, align=PP_ALIGN.CENTER)
|
||||||
|
|
||||||
|
add_rect(slide, 6.82, 1.5, 5.62, 4.85, WHITE, TEAL, radius=True)
|
||||||
|
add_text(slide, "布局布线后时序", 7.08, 1.78, 5.1, 0.3, 17, TEAL, True, TITLE_FONT, PP_ALIGN.CENTER)
|
||||||
|
add_table(
|
||||||
|
slide,
|
||||||
|
[
|
||||||
|
["时钟域", "频率", "Setup WNS", "端点"],
|
||||||
|
["cpu_clk", "33.333 MHz", "+0.737 ns", "17,197"],
|
||||||
|
["sys_clk", "50.000 MHz", "+0.125 ns", "22,307"],
|
||||||
|
["mlkem_clk", "76.923 MHz", "+0.070 ns", "31,646"],
|
||||||
|
],
|
||||||
|
7.08,
|
||||||
|
2.35,
|
||||||
|
5.1,
|
||||||
|
2.35,
|
||||||
|
widths=[1.15, 1.35, 1.35, 1.25],
|
||||||
|
size=10.5,
|
||||||
|
)
|
||||||
|
add_metric(slide, "88,843", "时序端点", 7.15, 5.0, 1.45, TEAL)
|
||||||
|
add_metric(slide, "0", "建立/保持违例", 8.95, 5.0, 1.45, GREEN)
|
||||||
|
add_metric(slide, "+0.070", "全系统最小WNS / ns", 10.72, 5.0, 1.45, ORANGE)
|
||||||
|
add_rect(slide, 1.0, 6.58, 11.2, 0.35, PALE_BLUE, BLUE)
|
||||||
|
add_text(slide, "ML-KEM独立高速时钟域隔离了系统总线布线压力。", 1.2, 6.66, 10.8, 0.18, 11.5, BLUE, True, align=PP_ALIGN.CENTER)
|
||||||
|
|
||||||
|
|
||||||
|
# 15. Performance
|
||||||
|
slide = new_content_slide("最终性能:Matmul满分与端到端加速", 15, "验证与实现结果")
|
||||||
|
for i, (value, label, accent, suffix) in enumerate([
|
||||||
|
("4.911765", "Matmul 5000组最终时间", BLUE, " ms"),
|
||||||
|
("827.80", "FFT DMA相对软件加速", ORANGE, "×"),
|
||||||
|
("48.95–53.33", "ML-KEM DMA相对软件加速", TEAL, "×"),
|
||||||
|
]):
|
||||||
|
x = 0.85 + i * 4.05
|
||||||
|
add_rect(slide, x, 1.5, 3.55, 1.05, WHITE, accent, radius=True)
|
||||||
|
add_metric(slide, value, label, x + 0.15, 1.66, 3.25, accent, suffix)
|
||||||
|
|
||||||
|
add_rect(slide, 0.78, 2.92, 7.2, 3.55, WHITE, ORANGE, radius=True)
|
||||||
|
add_text(slide, "ML-KEM三路径完整往返加速比", 1.02, 3.17, 6.72, 0.3, 16, ORANGE, True, TITLE_FONT, PP_ALIGN.CENTER)
|
||||||
|
levels = ["512", "768", "1024"]
|
||||||
|
cpu = [13.04, 13.84, 15.05]
|
||||||
|
dma = [48.95, 50.41, 53.33]
|
||||||
|
for i, level in enumerate(levels):
|
||||||
|
y = 3.74 + i * 0.72
|
||||||
|
add_text(slide, f"ML-KEM-{level}", 1.0, y + 0.16, 1.15, 0.22, 10.5, INK)
|
||||||
|
add_rect(slide, 2.25, y, cpu[i] / 60 * 4.65, 0.23, BLUE)
|
||||||
|
add_rect(slide, 2.25, y + 0.31, dma[i] / 60 * 4.65, 0.23, ORANGE)
|
||||||
|
add_text(slide, f"{cpu[i]:.2f}×", 2.33 + cpu[i] / 60 * 4.65, y - 0.02, 0.62, 0.2, 8.5, BLUE, True)
|
||||||
|
add_text(slide, f"{dma[i]:.2f}×", 2.33 + dma[i] / 60 * 4.65, y + 0.29, 0.62, 0.2, 8.5, ORANGE, True)
|
||||||
|
add_rect(slide, 2.15, 6.04, 0.15, 0.15, BLUE)
|
||||||
|
add_text(slide, "CPU寄存器路径", 2.4, 6.02, 1.25, 0.2, 9, MUTED)
|
||||||
|
add_rect(slide, 3.9, 6.04, 0.15, 0.15, ORANGE)
|
||||||
|
add_text(slide, "DMA窗口路径", 4.15, 6.02, 1.25, 0.2, 9, MUTED)
|
||||||
|
|
||||||
|
add_rect(slide, 8.28, 2.92, 4.15, 3.55, PALE_TEAL, TEAL, radius=True)
|
||||||
|
add_text(slide, "结果解释", 8.55, 3.18, 3.6, 0.3, 16, TEAL, True, TITLE_FONT, PP_ALIGN.CENTER)
|
||||||
|
add_bullets(
|
||||||
|
slide,
|
||||||
|
[
|
||||||
|
"Matmul CRC32 0x0417d761匹配",
|
||||||
|
"FFT DMA延迟296.73 μs,误差Re=1、Im=2",
|
||||||
|
"ML-KEM-512 DMA往返约1.605 ms",
|
||||||
|
"SRAM连续突发理论带宽200 MB/s",
|
||||||
|
],
|
||||||
|
8.55,
|
||||||
|
3.78,
|
||||||
|
3.55,
|
||||||
|
1.85,
|
||||||
|
size=12,
|
||||||
|
gap=6,
|
||||||
|
)
|
||||||
|
add_text(slide, "随机种子0xa3772ec8 · 最终得分100.00%", 8.55, 5.92, 3.55, 0.34, 10.5, ORANGE, True, align=PP_ALIGN.CENTER)
|
||||||
|
|
||||||
|
|
||||||
|
# 16. Lessons learned
|
||||||
|
slide = new_content_slide("项目心得:从单点优化走向系统工程", 16, "心得与后续工作")
|
||||||
|
lessons = [
|
||||||
|
("端到端优先", "计算核延迟不是唯一指标;启动、搬运、调度和校验共同决定评测时间。", BLUE),
|
||||||
|
("先正确再加速", "先建立CRC、状态寄存器和分层测试等可观测手段,再压缩流水空闲。", ORANGE),
|
||||||
|
("取舍必须显式", "Keccak复用、双蝶形NTT和零DSP策略是在面积、吞吐与部署复杂度间的选择。", TEAL),
|
||||||
|
("证据需要版本化", "报告、软件、RTL和实测日志必须共享同一数据基线,才能保证结论可复现。", GREEN),
|
||||||
|
]
|
||||||
|
for i, (title, desc, accent) in enumerate(lessons):
|
||||||
|
col, row = i % 2, i // 2
|
||||||
|
x, y = 0.82 + col * 6.0, 1.55 + row * 2.45
|
||||||
|
add_rect(slide, x, y, 5.55, 1.85, WHITE, accent, radius=True)
|
||||||
|
add_number_badge(slide, f"0{i+1}", x + 0.25, y + 0.28, accent)
|
||||||
|
add_text(slide, title, x + 0.95, y + 0.27, 4.2, 0.32, 16, accent, True)
|
||||||
|
add_text(slide, desc, x + 0.35, y + 0.9, 4.85, 0.58, 12, INK, align=PP_ALIGN.CENTER)
|
||||||
|
add_rect(slide, 1.0, 6.38, 11.15, 0.42, PALE_ORANGE, ORANGE)
|
||||||
|
add_text(slide, "最终满分来自软硬件协同,而不是单一模块参数的堆叠。", 1.2, 6.5, 10.75, 0.2, 13, INK, True, align=PP_ALIGN.CENTER)
|
||||||
|
|
||||||
|
|
||||||
|
# 17. Future work
|
||||||
|
slide = new_content_slide("后续工作:沿性能、验证与工程化继续演进", 17, "心得与后续工作")
|
||||||
|
future = [
|
||||||
|
(BLUE, "ML-KEM并行度", "增加Keccak并行路径,扩展NTT蝶形单元并评估面积收益比。"),
|
||||||
|
(ORANGE, "存储专项验证", "补充SRAM随机反压、跨Bank边界与持续带宽微基准。"),
|
||||||
|
(TEAL, "实现与功耗证据", "完善I/O约束,使用SAIF/VCD活动率回标提高功耗估计可信度。"),
|
||||||
|
(GREEN, "版本与回归体系", "统一RTL、软件、测试向量和报告指标,形成自动化回归基线。"),
|
||||||
|
]
|
||||||
|
for i, (accent, title, desc) in enumerate(future):
|
||||||
|
y = 1.48 + i * 1.22
|
||||||
|
add_number_badge(slide, f"0{i+1}", 0.92, y, accent)
|
||||||
|
add_text(slide, title, 1.65, y + 0.07, 2.15, 0.3, 15, accent, True)
|
||||||
|
add_text(slide, desc, 3.92, y + 0.06, 7.85, 0.4, 13, INK)
|
||||||
|
add_line(slide, 0.95, y + 0.76, 11.15, 0.012, LINE)
|
||||||
|
add_rect(slide, 1.0, 6.45, 11.15, 0.35, PALE_TEAL, TEAL)
|
||||||
|
add_text(slide, "目标:在不牺牲标准完整性和可验证性的前提下继续提高系统吞吐。", 1.2, 6.55, 10.75, 0.18, 12.5, INK, True, align=PP_ALIGN.CENTER)
|
||||||
|
|
||||||
|
|
||||||
|
# 18. Summary
|
||||||
|
slide = new_content_slide("总结:完成从算法IP到板级系统的闭环", 18, "总结与展望")
|
||||||
|
summary = [
|
||||||
|
("01", "系统", "构建CPU、DMA、存储与三个计算加速器协同的异构SoC", BLUE),
|
||||||
|
("02", "数据流", "以SRAM连续突发、DMA端点和双Bank调度降低搬运开销", ORANGE),
|
||||||
|
("03", "密码IP", "单比特流覆盖ML-KEM三等级、三操作和常量时间拒绝", TEAL),
|
||||||
|
("04", "工程验证", "零DSP、三个时钟域收敛,并通过仿真与板级分层验证", GREEN),
|
||||||
|
]
|
||||||
|
for i, (num, tag, desc, accent) in enumerate(summary):
|
||||||
|
y = 1.52 + i * 1.08
|
||||||
|
add_number_badge(slide, num, 0.95, y, accent)
|
||||||
|
add_text(slide, tag, 1.65, y + 0.08, 1.0, 0.28, 15, accent, True)
|
||||||
|
add_text(slide, desc, 2.75, y + 0.08, 8.95, 0.36, 14, INK)
|
||||||
|
add_line(slide, 0.95, y + 0.72, 11.2, 0.012, LINE)
|
||||||
|
add_rect(slide, 0.92, 6.02, 11.3, 0.62, PALE_ORANGE, ORANGE)
|
||||||
|
add_rich(
|
||||||
|
slide,
|
||||||
|
[
|
||||||
|
("最终结果:", 12.5, True, INK, FONT),
|
||||||
|
("5000", 12.5, True, INK, LATIN_FONT),
|
||||||
|
("组 Matmul 用时4.911765 ms · CRC32匹配 · 得分100.00%", 12.5, True, INK, FONT),
|
||||||
|
],
|
||||||
|
1.12,
|
||||||
|
6.2,
|
||||||
|
10.9,
|
||||||
|
0.3,
|
||||||
|
PP_ALIGN.CENTER,
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
# 19. End
|
||||||
|
slide = prs.slides.add_slide(blank)
|
||||||
|
add_template_image(slide, "image3.png", 0, 0, W, H)
|
||||||
|
add_template_image(slide, "image4.png", 5.92, 0.7, 1.48, 1.48)
|
||||||
|
add_text(slide, "感谢聆听", 3.45, 2.55, 6.45, 0.75, 34, BLUE, True, TITLE_FONT, PP_ALIGN.CENTER)
|
||||||
|
add_rect(slide, 4.63, 3.65, 4.08, 0.72, BLUE, radius=True)
|
||||||
|
add_text(slide, "Q&A", 4.75, 3.83, 3.84, 0.3, 22, WHITE, True, LATIN_FONT, PP_ALIGN.CENTER)
|
||||||
|
add_text(slide, "中国集成电路未来之星从这里起步!", 3.2, 5.2, 6.95, 0.42, 17, INK, True, align=PP_ALIGN.CENTER)
|
||||||
|
|
||||||
|
|
||||||
|
# 20. Backup: address space
|
||||||
|
slide = new_content_slide("备用:地址空间与软件控制流程", 20, "答疑备用")
|
||||||
|
add_table(
|
||||||
|
slide,
|
||||||
|
[
|
||||||
|
["AXI从端", "基地址", "功能"],
|
||||||
|
["S0", "0x1c00_0000", "BaseRAM / ExtRAM,共8 MB"],
|
||||||
|
["S5", "0x1f30_0000", "DMA与矩阵批量序列器"],
|
||||||
|
["S6", "0x1f40_0000", "FFT / ML-KEM共享窗口"],
|
||||||
|
["S7", "0x1f50_0000", "Matmul控制与数据Bank"],
|
||||||
|
],
|
||||||
|
0.8,
|
||||||
|
1.55,
|
||||||
|
6.2,
|
||||||
|
3.75,
|
||||||
|
widths=[1.0, 2.0, 3.2],
|
||||||
|
size=12,
|
||||||
|
)
|
||||||
|
add_rect(slide, 7.4, 1.55, 4.8, 3.75, WHITE, TEAL, radius=True)
|
||||||
|
add_text(slide, "软件控制流程", 7.7, 1.83, 4.2, 0.3, 17, TEAL, True, TITLE_FONT, PP_ALIGN.CENTER)
|
||||||
|
for i, text in enumerate(["写配置寄存器", "配置DMA窗口", "启动硬件", "轮询done", "读取结果 / CRC"]):
|
||||||
|
y = 2.35 + i * 0.56
|
||||||
|
add_rect(slide, 8.05, y, 3.5, 0.38, PALE_GRAY, TEAL if i < 3 else BLUE)
|
||||||
|
add_text(slide, text, 8.15, y + 0.1, 3.3, 0.17, 10.5, INK, True, align=PP_ALIGN.CENTER)
|
||||||
|
add_rect(slide, 0.92, 5.75, 11.25, 0.62, PALE_TEAL, TEAL)
|
||||||
|
add_text(slide, "快速路径中CPU不参与逐组Matmul调度;ML-KEM DMA路径只进行少量批量窗口配置。", 1.15, 5.93, 10.8, 0.26, 12.5, INK, True, align=PP_ALIGN.CENTER)
|
||||||
|
|
||||||
|
|
||||||
|
# 21. Backup: KeyGen timing
|
||||||
|
slide = new_content_slide("备用:ML-KEM-512 KeyGen逐状态周期分解", 21, "答疑备用")
|
||||||
|
states = [
|
||||||
|
("G哈希", 27, YELLOW),
|
||||||
|
("SampleNTT矩阵A", 3213, ORANGE),
|
||||||
|
("CBD采样", 1229, TEAL),
|
||||||
|
("NTT", 4172, BLUE),
|
||||||
|
("多项式基乘", 2096, GREEN),
|
||||||
|
("密钥编码", 2081, RED),
|
||||||
|
]
|
||||||
|
for i, (name, cycles, accent) in enumerate(states):
|
||||||
|
y = 1.52 + i * 0.72
|
||||||
|
add_text(slide, name, 0.9, y + 0.1, 1.55, 0.22, 11, INK)
|
||||||
|
add_rect(slide, 2.5, y + 0.1, 6.45, 0.25, "E5E9F1")
|
||||||
|
add_rect(slide, 2.5, y + 0.1, 6.45 * cycles / 4500, 0.25, accent)
|
||||||
|
add_text(slide, f"{cycles:,} cyc", 9.1, y + 0.06, 1.0, 0.25, 10, accent, True, align=PP_ALIGN.RIGHT)
|
||||||
|
add_rect(slide, 10.45, 1.55, 2.0, 4.3, PALE_ORANGE, ORANGE, radius=True)
|
||||||
|
add_text(slide, "主要瓶颈", 10.7, 1.88, 1.5, 0.3, 16, ORANGE, True, TITLE_FONT, PP_ALIGN.CENTER)
|
||||||
|
add_text(slide, "NTT\n30.2%", 10.73, 2.5, 1.45, 0.65, 19, BLUE, True, align=PP_ALIGN.CENTER)
|
||||||
|
add_text(slide, "SampleNTT\n23.3%", 10.68, 3.55, 1.55, 0.65, 16, ORANGE, True, align=PP_ALIGN.CENTER)
|
||||||
|
add_text(slide, "两者合计\n53.5%", 10.72, 4.65, 1.48, 0.65, 15, INK, True, align=PP_ALIGN.CENTER)
|
||||||
|
add_rect(slide, 0.92, 6.25, 11.25, 0.58, PALE_ORANGE, ORANGE)
|
||||||
|
add_text(slide, "优化优先级:增加采样路径Keccak并行度,其次扩展NTT蝶形单元数量。", 1.12, 6.42, 10.85, 0.24, 12.5, INK, True, align=PP_ALIGN.CENTER)
|
||||||
|
|
||||||
|
|
||||||
|
# 22. Backup: tradeoffs
|
||||||
|
slide = new_content_slide("备用:设计取舍与优化路线", 22, "答疑备用")
|
||||||
|
add_table(
|
||||||
|
slide,
|
||||||
|
[
|
||||||
|
["维度", "当前选择", "优势", "代价"],
|
||||||
|
["安全等级", "运行时k=2/3/4", "单比特流部署", "地址与控制逻辑增加"],
|
||||||
|
["Keccak", "单核时分复用", "节省约10.6k LUT", "状态间无法重叠"],
|
||||||
|
["NTT", "双蝶形、4 coeff/cycle", "BRAM无冲突、0 DSP", "吞吐低于多BU实现"],
|
||||||
|
["控制", "30状态硬连线FSM", "行为清晰、易验证", "串行调度限制性能"],
|
||||||
|
],
|
||||||
|
0.72,
|
||||||
|
1.48,
|
||||||
|
11.85,
|
||||||
|
3.62,
|
||||||
|
widths=[1.4, 3.05, 3.35, 4.05],
|
||||||
|
size=11.3,
|
||||||
|
)
|
||||||
|
add_text(slide, "优化路线", 0.92, 5.42, 1.45, 0.3, 17, ORANGE, True, TITLE_FONT)
|
||||||
|
roadmap = [
|
||||||
|
("1", "双Keccak或专用采样核", "预计KeyGen下降15%–20%", ORANGE),
|
||||||
|
("2", "扩展多BU NTT", "提高至8 coeff/cycle", TEAL),
|
||||||
|
("3", "完善约束与活动率回标", "提高时序与功耗结论置信度", BLUE),
|
||||||
|
]
|
||||||
|
for i, (num, title, desc, accent) in enumerate(roadmap):
|
||||||
|
x = 0.95 + i * 4.05
|
||||||
|
add_number_badge(slide, num, x, 5.88, accent)
|
||||||
|
add_text(slide, title, x + 0.62, 5.86, 2.95, 0.28, 12, accent, True)
|
||||||
|
add_text(slide, desc, x + 0.62, 6.23, 2.95, 0.4, 10.5, INK)
|
||||||
|
|
||||||
|
|
||||||
|
prs.save(OUTPUT)
|
||||||
|
print(f"Wrote {OUTPUT} from {TEMPLATE}")
|
||||||
BIN
doc/reports/defense/defense_presentation.pdf
Normal file
BIN
doc/reports/defense/defense_presentation.pdf
Normal file
Binary file not shown.
BIN
doc/reports/defense/defense_presentation.pptx
Normal file
BIN
doc/reports/defense/defense_presentation.pptx
Normal file
Binary file not shown.
115
doc/reports/defense/defense_speech.md
Normal file
115
doc/reports/defense/defense_speech.md
Normal file
@@ -0,0 +1,115 @@
|
|||||||
|
# 系统设计答辩演讲稿
|
||||||
|
|
||||||
|
预计主讲时间:9分45秒。第1至18页为主讲内容,第19页结束,第20至22页仅用于答疑。
|
||||||
|
|
||||||
|
## 第1页:封面(0:00—0:15)
|
||||||
|
|
||||||
|
各位评委老师好。我们的作品是“基于龙芯SoC的后量子密码与矩阵运算加速系统”。系统以OpenLA500为控制核心,在Artix-7 FPGA上集成DMA、矩阵乘法、FFT和全参数ML-KEM硬件IP。
|
||||||
|
|
||||||
|
## 第2页:团队介绍(0:15—0:35)
|
||||||
|
|
||||||
|
团队围绕完整系统形成三类协同分工:系统架构与SoC集成负责AXI、DMA、多时钟域和SRAM;密码算法与RTL实现负责ML-KEM及其关键算子;软件验证、测试与文档负责板级程序、分层回归和证据整理。三部分通过统一接口和可重复测试共同迭代。
|
||||||
|
|
||||||
|
## 第3页:目录(0:35—0:45)
|
||||||
|
|
||||||
|
下面从项目与系统方案、自主计算IP、验证与实现结果,以及心得和后续工作四部分进行汇报。
|
||||||
|
|
||||||
|
## 第4页:作品亮点预览——系统方案(0:45—1:15)
|
||||||
|
|
||||||
|
系统的核心思路是让CPU负责配置与判断,让硬件负责数据搬运和计算。OpenLA500与DMA构成两个AXI主设备,Matmul、FFT和ML-KEM作为独立外设接入。一次启动可以完成5000组Matmul任务;SRAM连续突发在无反压时达到每周期一个数据拍;单一ML-KEM比特流覆盖三等级、三操作;三个异步时钟域由完整AXI双时钟FIFO连接。全系统DSP使用量为零。
|
||||||
|
|
||||||
|
## 第5页:作品亮点预览——关键结果(1:15—1:45)
|
||||||
|
|
||||||
|
先给出最终结果。5000组Matmul官方评测用时4.911765毫秒,CRC32期望值与上报值均为0x0417d761,得分100%。FFT的DMA模式相对软件加速827.80倍;ML-KEM的DMA路径相对软件加速48.95到53.33倍。ML-KEM通过9000个主路径KAT、300个隐式拒绝向量和900次板级运行。系统覆盖88843个时序端点且无时序违例。
|
||||||
|
|
||||||
|
## 第6页:开发过程总结(1:45—2:10)
|
||||||
|
|
||||||
|
开发过程分为六个阶段:先跑通基础SoC和串口,再接入各计算IP;随后以DMA端点、双Bank和SRAM连续突发优化数据通路;再完成PLL分域、AXI跨时钟域和复位验证;最后用叶模块、IP、SoC和板级四层证据持续回归。Matmul从阶段性正确结果迭代到最终满分,说明性能优化必须同时观察功能、总线状态、时序和端到端时间。
|
||||||
|
|
||||||
|
## 第7页:赛题要求与设计响应(2:10—2:40)
|
||||||
|
|
||||||
|
赛题要求的不是孤立计算核,而是能够运行和验证的完整SoC。针对5000组矩阵计算和零DSP约束,我们设计全LUT乘加核心、双Bank序列器和在线CRC32。针对FIPS 203,实现单比特流三等级、三操作的ML-KEM。针对端到端性能,扩展四通道DMA、加速器端点和SRAM连续突发,使CPU不再逐字搬运,也不参与逐组任务调度。
|
||||||
|
|
||||||
|
## 第8页:总体架构与自主设计边界(2:40—3:20)
|
||||||
|
|
||||||
|
系统采用双主八从AXI架构。CPU负责程序执行、参数配置和结果判断,DMA负责内存与加速器之间的批量传输,三个加速器具有独立地址空间。
|
||||||
|
|
||||||
|
这里明确自主设计边界。OpenLA500、板级SRAM器件、UART及基础外设来自赛事平台。我们完成四通道DMA扩展、Matmul与批量序列器、FFT、ML-KEM、两级AXI跨时钟域桥,以及基础SRAM控制器的突发流水化改造。工作重点是自主计算IP和贯穿SoC的数据通路。
|
||||||
|
|
||||||
|
## 第9页:数据搬运、SRAM与三时钟域(3:20—4:05)
|
||||||
|
|
||||||
|
CPU域为33.333兆赫;AXI互连、DMA、SRAM、Matmul和FFT位于50兆赫系统域;ML-KEM核心独立运行在76.923兆赫。CPU到系统、系统到ML-KEM的AXI五通道均通过双时钟FIFO跨域。复位按系统域、ML-KEM域、CPU域顺序释放,复位前AXI有效信号保持为零。
|
||||||
|
|
||||||
|
我们通过下一地址预驱动、读数据寄存和连续写握手,消除SRAM读数据拍之间的固定空闲周期,实现无反压时每周期一个32位数据拍。50兆赫下理论单向带宽为200 MB每秒。这个数值是接口节拍上限,不作为独立微基准实测值。
|
||||||
|
|
||||||
|
## 第10页:Matmul批量流水(4:05—4:50)
|
||||||
|
|
||||||
|
CPU只配置源地址、组数和跨步,序列器随后接管5000组任务。每组由CDMA读取128字节A、B矩阵并交替装入两个Bank;一个Bank计算时,另一个Bank可加载下一组。
|
||||||
|
|
||||||
|
计算核心使用四个32位无符号乘法器和加法树得到66位结果,稳定后每周期产生一个C元素。结果进入CRC FIFO,FIFO吸收乘加和递归CRC32之间的速率差。快速模式跳过192字节结果写回,但不会跳过计算和CRC。最后一组退休后仍等待CRC完全排空才产生DONE,因此最终CRC覆盖全部逻辑结果。
|
||||||
|
|
||||||
|
## 第11页:ML-KEM总体架构(4:50—5:30)
|
||||||
|
|
||||||
|
ML-KEM分为控制调度层、算子层和BRAM存储层。算子层包含Keccak、NTT、多项式乘法、采样和压缩解压缩。安全等级k和操作类型在start时锁存,存储按最大等级静态分配,循环边界和地址由k运行时推导。因此同一比特流支持ML-KEM-512、768、1024,以及KeyGen、Encaps和Decaps,无需重新综合。
|
||||||
|
|
||||||
|
## 第12页:ML-KEM关键设计(5:30—6:15)
|
||||||
|
|
||||||
|
第一,G、H、J哈希、SampleNTT和CBD处于互斥阶段,因此共享一个Keccak-f核,约节省10600个LUT。第二,NTT采用四路Banked BRAM和两个蝶形流水线,四个Bank无冲突提供两对系数,达到每周期四个系数且不使用DSP。第三,Decaps重加密直接复用Encaps状态序列,密文比较逐字节执行且不提前退出,Accept和Reject路径总周期完全相等。设计优先保证全参数支持、标准完整性和面积可控。
|
||||||
|
|
||||||
|
## 第13页:四层验证(6:15—6:55)
|
||||||
|
|
||||||
|
验证采用四层递进结构。叶模块层将Keccak、NTT、蝶形、FIFO和CRC32与参考模型比较;IP层验证完整控制流;SoC层验证AXI解码、跨时钟域、复位和SRAM取指;板级层由真实CPU软件形成闭环。
|
||||||
|
|
||||||
|
ML-KEM通过9000个主路径KAT和300个隐式拒绝向量,板级三等级、三路径共900次运行零失败。FFT在CPU和DMA模式下共运行六次。Matmul最终评测完成5000组随机输入,CRC32匹配并达到满分。
|
||||||
|
|
||||||
|
## 第14页:资源与时序(6:55—7:30)
|
||||||
|
|
||||||
|
系统在xc7a200tfbg676-1上完成布局布线。使用55066个LUT,占41.16%;31000个寄存器,占11.58%;29.5个BRAM Tile,占8.08%;DSP为零。CPU、系统和ML-KEM域的建立时间WNS分别为正0.737、正0.125和正0.070纳秒,没有建立或保持违例。独立ML-KEM时钟域隔离了系统总线的布线压力。
|
||||||
|
|
||||||
|
## 第15页:最终板级性能(7:30—8:20)
|
||||||
|
|
||||||
|
Matmul最终评测的随机种子为0xa3772ec8,5000组运行用时4.911765毫秒,平均每组约0.982微秒;在50兆赫系统时钟下约为49.12周期每组,CRC32完全匹配并获得100分。与阶段验证的6.944404毫秒中位值相比,最终时间降低约29.27%,收益来自启动、搬运、调度、计算和CRC全链路协同。
|
||||||
|
|
||||||
|
FFT DMA模式延迟296.73微秒,相对软件加速827.80倍,最大误差为实部1、虚部2。ML-KEM改用DMA窗口后,相对软件加速48.95到53.33倍,其中512等级完整往返约1.605毫秒。
|
||||||
|
|
||||||
|
## 第16页:项目心得体会(8:20—8:55)
|
||||||
|
|
||||||
|
本项目形成四点认识。第一,端到端性能比孤立计算核延迟更重要。第二,必须先建立CRC、状态寄存器和分层测试等可观测手段,再进行激进优化。第三,资源共享和并行度是明确的工程取舍。第四,报告、软件、RTL和实测日志必须共享版本化数据基线。最终满分来自软硬件协同,而不是单一参数堆叠。
|
||||||
|
|
||||||
|
## 第17页:后续工作(8:55—9:20)
|
||||||
|
|
||||||
|
后续从四方面推进:增加Keccak并行路径并扩展NTT蝶形单元;补充SRAM随机反压、跨Bank边界和持续带宽专项测试;使用SAIF或VCD活动率回标提高功耗结论可信度;统一RTL、软件、测试向量和报告指标,形成自动化回归基线。优化仍以标准完整性和可验证性为前提。
|
||||||
|
|
||||||
|
## 第18页:总结(9:20—9:45)
|
||||||
|
|
||||||
|
本项目构建了CPU、DMA、共享存储器与三个加速器协同的异构SoC;以SRAM连续突发、DMA端点和双Bank调度优化数据流;实现单比特流三等级、三操作的ML-KEM;并以零DSP完成布局布线和分层验证。最终5000组Matmul用时4.911765毫秒,CRC32匹配,得分100%。我的汇报完毕,谢谢各位老师。
|
||||||
|
|
||||||
|
## 常见追问速答
|
||||||
|
|
||||||
|
### 为什么设计三个时钟域?
|
||||||
|
|
||||||
|
CPU、外部SRAM和ML-KEM算法核心的时序能力不同。分域使ML-KEM运行在76.923 MHz,同时保持SRAM和系统总线在50 MHz可靠工作;跨域由五通道AXI双时钟FIFO完成。
|
||||||
|
|
||||||
|
### 200 MB/s是否为实测带宽?
|
||||||
|
|
||||||
|
不是。它是50 MHz乘以32位得到的连续传输理论单向上限。板级业务间接验证了连续突发正确性,但当前报告没有独立SRAM微基准。
|
||||||
|
|
||||||
|
### 快速模式不写回结果,如何保证正确性?
|
||||||
|
|
||||||
|
矩阵核心仍计算全部66位结果,并按标准字节序进入CRC32。DONE只在最后一组退休且CRC FIFO完全排空后产生,因此官方CRC覆盖全部逻辑结果序列。
|
||||||
|
|
||||||
|
### Matmul为何能从6.94毫秒降至4.91毫秒?
|
||||||
|
|
||||||
|
优化不只发生在乘加核心,而是同时减少软件启动开销、批量调度空闲和SRAM突发间隙,并保持计算与CRC消费重叠。最终每组从约69.4个系统周期降到约49.12个周期。
|
||||||
|
|
||||||
|
### 为什么ML-KEM慢于部分论文?
|
||||||
|
|
||||||
|
本设计支持单比特流三等级、三种完整操作、SoC接口和零DSP。部分论文针对固定等级或单一操作综合,并使用更多蝶形单元或DSP。当前单Keccak和双蝶形NTT是主要性能限制。
|
||||||
|
|
||||||
|
### 如何保证复位前没有操作?
|
||||||
|
|
||||||
|
各时钟域采用异步置位、同步撤离,并按sys、mlkem、cpu顺序释放。复位期间AXI valid、加速器start和DMA请求保持为零,系统仿真检查了首次取指前的事务状态。
|
||||||
|
|
||||||
|
### 为什么全系统不用DSP?
|
||||||
|
|
||||||
|
Matmul零DSP是赛题约束。为了统一资源策略,FFT和ML-KEM乘法也映射到LUT和进位链。这增加LUT消耗,但保证全系统DSP使用量为零。
|
||||||
BIN
doc/reports/defense/ppt_template.pdf
Normal file
BIN
doc/reports/defense/ppt_template.pdf
Normal file
Binary file not shown.
BIN
doc/reports/defense/ppt_template.pptx
Normal file
BIN
doc/reports/defense/ppt_template.pptx
Normal file
Binary file not shown.
Binary file not shown.
@@ -81,7 +81,6 @@
|
|||||||
|
|
||||||
\end{titlepage}
|
\end{titlepage}
|
||||||
|
|
||||||
\maketitle
|
|
||||||
\tableofcontents
|
\tableofcontents
|
||||||
\newpage
|
\newpage
|
||||||
|
|
||||||
|
|||||||
BIN
doc/reports/system/matmul_dataflow_gantt.png
Normal file
BIN
doc/reports/system/matmul_dataflow_gantt.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 206 KiB |
180
doc/reports/system/matmul_dataflow_gantt.svg
Normal file
180
doc/reports/system/matmul_dataflow_gantt.svg
Normal file
@@ -0,0 +1,180 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<svg xmlns="http://www.w3.org/2000/svg" width="1800" height="940" viewBox="0 0 1800 940">
|
||||||
|
<defs>
|
||||||
|
<style>
|
||||||
|
text { font-family: "Noto Sans CJK SC", "Source Han Sans SC", sans-serif; fill: #17202a; letter-spacing: 0; }
|
||||||
|
.title { font-size: 31px; font-weight: 700; }
|
||||||
|
.subtitle { font-size: 18px; fill: #52606d; }
|
||||||
|
.lane { font-size: 20px; font-weight: 600; }
|
||||||
|
.tick { font-size: 16px; fill: #52606d; }
|
||||||
|
.bartext { font-size: 17px; font-weight: 600; }
|
||||||
|
.small { font-size: 15px; }
|
||||||
|
.grid { stroke: #d8dee4; stroke-width: 1; }
|
||||||
|
.axis { stroke: #657786; stroke-width: 2; }
|
||||||
|
.load { fill: #d7e9ff; stroke: #2674c9; stroke-width: 2; }
|
||||||
|
.compute { fill: #d8f3dc; stroke: #27864b; stroke-width: 2; }
|
||||||
|
.result { fill: #e8e0fa; stroke: #7254b3; stroke-width: 2; }
|
||||||
|
.crc { fill: #ffe8bd; stroke: #c77900; stroke-width: 2; }
|
||||||
|
.control { fill: #e8edf2; stroke: #62717f; stroke-width: 2; }
|
||||||
|
.done { fill: #d9f3ef; stroke: #168477; stroke-width: 2; }
|
||||||
|
.disabled { fill: #f4f5f6; stroke: #8a949e; stroke-width: 2; stroke-dasharray: 9 7; }
|
||||||
|
.prefetch { fill: none; stroke: #2674c9; stroke-width: 2; stroke-dasharray: 7 5; }
|
||||||
|
.arrow { stroke: #657786; stroke-width: 2; fill: none; marker-end: url(#arrowhead); }
|
||||||
|
</style>
|
||||||
|
<marker id="arrowhead" markerWidth="10" markerHeight="7" refX="9" refY="3.5" orient="auto">
|
||||||
|
<polygon points="0 0, 10 3.5, 0 7" fill="#657786"/>
|
||||||
|
</marker>
|
||||||
|
</defs>
|
||||||
|
|
||||||
|
<rect width="1800" height="940" fill="#ffffff"/>
|
||||||
|
<text x="42" y="48" class="title">Matmul 快速通道数据流甘特图</text>
|
||||||
|
<text x="42" y="78" class="subtitle">展示前四组进入稳态及最后收尾过程;阶段宽度用于表达依赖和重叠关系,不按周期严格缩放</text>
|
||||||
|
|
||||||
|
<!-- Time axis and grid -->
|
||||||
|
<line x1="350" y1="118" x2="1740" y2="118" class="axis"/>
|
||||||
|
<g>
|
||||||
|
<line x1="350" y1="118" x2="350" y2="846" class="grid"/>
|
||||||
|
<line x1="470" y1="118" x2="470" y2="846" class="grid"/>
|
||||||
|
<line x1="650" y1="118" x2="650" y2="846" class="grid"/>
|
||||||
|
<line x1="830" y1="118" x2="830" y2="846" class="grid"/>
|
||||||
|
<line x1="1010" y1="118" x2="1010" y2="846" class="grid"/>
|
||||||
|
<line x1="1190" y1="118" x2="1190" y2="846" class="grid"/>
|
||||||
|
<line x1="1370" y1="118" x2="1370" y2="846" class="grid"/>
|
||||||
|
<line x1="1510" y1="118" x2="1510" y2="846" class="grid"/>
|
||||||
|
<line x1="1640" y1="118" x2="1640" y2="846" class="grid"/>
|
||||||
|
<line x1="1740" y1="118" x2="1740" y2="846" class="grid"/>
|
||||||
|
</g>
|
||||||
|
<g text-anchor="middle">
|
||||||
|
<text x="410" y="108" class="tick">启动</text>
|
||||||
|
<text x="560" y="108" class="tick">组0装载</text>
|
||||||
|
<text x="740" y="108" class="tick">组1装载</text>
|
||||||
|
<text x="920" y="108" class="tick">组2装载</text>
|
||||||
|
<text x="1100" y="108" class="tick">组3装载</text>
|
||||||
|
<text x="1280" y="108" class="tick">稳态流水</text>
|
||||||
|
<text x="1440" y="108" class="tick">末组计算</text>
|
||||||
|
<text x="1575" y="108" class="tick">CRC排空</text>
|
||||||
|
<text x="1690" y="108" class="tick">完成</text>
|
||||||
|
</g>
|
||||||
|
|
||||||
|
<!-- Lane separators and labels -->
|
||||||
|
<g>
|
||||||
|
<line x1="34" y1="200" x2="1740" y2="200" class="grid"/>
|
||||||
|
<line x1="34" y1="280" x2="1740" y2="280" class="grid"/>
|
||||||
|
<line x1="34" y1="360" x2="1740" y2="360" class="grid"/>
|
||||||
|
<line x1="34" y1="440" x2="1740" y2="440" class="grid"/>
|
||||||
|
<line x1="34" y1="520" x2="1740" y2="520" class="grid"/>
|
||||||
|
<line x1="34" y1="600" x2="1740" y2="600" class="grid"/>
|
||||||
|
<line x1="34" y1="680" x2="1740" y2="680" class="grid"/>
|
||||||
|
<line x1="34" y1="760" x2="1740" y2="760" class="grid"/>
|
||||||
|
<line x1="34" y1="840" x2="1740" y2="840" class="grid"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<text x="44" y="170" class="lane">批量序列器</text>
|
||||||
|
<text x="44" y="250" class="lane">CDMA / AXI读</text>
|
||||||
|
<text x="44" y="330" class="lane">Bank 0 A/B</text>
|
||||||
|
<text x="44" y="410" class="lane">Bank 1 A/B</text>
|
||||||
|
<text x="44" y="490" class="lane">单一乘加流水线</text>
|
||||||
|
<text x="44" y="570" class="lane">C结果与退休</text>
|
||||||
|
<text x="44" y="650" class="lane">CRC结果FIFO</text>
|
||||||
|
<text x="44" y="730" class="lane">递归CRC32</text>
|
||||||
|
<text x="44" y="810" class="lane">ExtRAM结果写回</text>
|
||||||
|
</g>
|
||||||
|
|
||||||
|
<!-- Sequencer -->
|
||||||
|
<rect x="360" y="142" width="105" height="42" rx="4" class="control"/>
|
||||||
|
<text x="412" y="169" text-anchor="middle" class="bartext">清状态/CRC</text>
|
||||||
|
<rect x="470" y="142" width="1035" height="42" rx="4" class="control"/>
|
||||||
|
<text x="987" y="169" text-anchor="middle" class="bartext">提交读请求、维护双Bank有效位与计算队列</text>
|
||||||
|
<rect x="1510" y="142" width="125" height="42" rx="4" class="crc"/>
|
||||||
|
<text x="1572" y="169" text-anchor="middle" class="bartext">等待CRC空闲</text>
|
||||||
|
<rect x="1640" y="142" width="95" height="42" rx="4" class="done"/>
|
||||||
|
<text x="1687" y="169" text-anchor="middle" class="bartext">DONE</text>
|
||||||
|
|
||||||
|
<!-- CDMA shared read channel -->
|
||||||
|
<rect x="470" y="222" width="175" height="42" rx="4" class="load"/>
|
||||||
|
<text x="557" y="249" text-anchor="middle" class="bartext">G0: 128 B -> B0</text>
|
||||||
|
<rect x="650" y="222" width="175" height="42" rx="4" class="load"/>
|
||||||
|
<text x="737" y="249" text-anchor="middle" class="bartext">G1: 128 B -> B1</text>
|
||||||
|
<rect x="830" y="222" width="175" height="42" rx="4" class="load"/>
|
||||||
|
<text x="917" y="249" text-anchor="middle" class="bartext">G2: 128 B -> B0</text>
|
||||||
|
<rect x="1010" y="222" width="175" height="42" rx="4" class="load"/>
|
||||||
|
<text x="1097" y="249" text-anchor="middle" class="bartext">G3: 128 B -> B1</text>
|
||||||
|
<rect x="1190" y="222" width="315" height="42" rx="4" class="load"/>
|
||||||
|
<text x="1347" y="249" text-anchor="middle" class="bartext">G4 ... G4999 顺序返回</text>
|
||||||
|
<path d="M 585 216 L 735 216 M 765 216 L 915 216 M 945 216 L 1095 216" class="prefetch"/>
|
||||||
|
<text x="1310" y="216" text-anchor="middle" class="small" fill="#2674c9">共享R通道:1个活动突发 + 1个预取请求</text>
|
||||||
|
|
||||||
|
<!-- Bank buffers -->
|
||||||
|
<rect x="470" y="302" width="175" height="42" rx="4" class="load"/>
|
||||||
|
<text x="557" y="329" text-anchor="middle" class="bartext">装载 G0</text>
|
||||||
|
<rect x="650" y="302" width="175" height="42" rx="4" class="compute"/>
|
||||||
|
<text x="737" y="329" text-anchor="middle" class="bartext">供计算 G0</text>
|
||||||
|
<rect x="830" y="302" width="175" height="42" rx="4" class="load"/>
|
||||||
|
<text x="917" y="329" text-anchor="middle" class="bartext">装载 G2</text>
|
||||||
|
<rect x="1010" y="302" width="175" height="42" rx="4" class="compute"/>
|
||||||
|
<text x="1097" y="329" text-anchor="middle" class="bartext">供计算 G2</text>
|
||||||
|
<rect x="1190" y="302" width="315" height="42" rx="4" class="control"/>
|
||||||
|
<text x="1347" y="329" text-anchor="middle" class="bartext">偶数组循环复用</text>
|
||||||
|
|
||||||
|
<rect x="470" y="382" width="175" height="42" rx="4" class="control"/>
|
||||||
|
<text x="557" y="409" text-anchor="middle" class="bartext">空闲</text>
|
||||||
|
<rect x="650" y="382" width="175" height="42" rx="4" class="load"/>
|
||||||
|
<text x="737" y="409" text-anchor="middle" class="bartext">装载 G1</text>
|
||||||
|
<rect x="830" y="382" width="175" height="42" rx="4" class="compute"/>
|
||||||
|
<text x="917" y="409" text-anchor="middle" class="bartext">供计算 G1</text>
|
||||||
|
<rect x="1010" y="382" width="175" height="42" rx="4" class="load"/>
|
||||||
|
<text x="1097" y="409" text-anchor="middle" class="bartext">装载 G3</text>
|
||||||
|
<rect x="1190" y="382" width="315" height="42" rx="4" class="control"/>
|
||||||
|
<text x="1347" y="409" text-anchor="middle" class="bartext">奇数组循环复用</text>
|
||||||
|
|
||||||
|
<!-- Shared compute pipeline -->
|
||||||
|
<rect x="650" y="462" width="165" height="42" rx="4" class="compute"/>
|
||||||
|
<text x="732" y="489" text-anchor="middle" class="bartext">G0 发射16项</text>
|
||||||
|
<rect x="815" y="462" width="165" height="42" rx="4" class="compute"/>
|
||||||
|
<text x="897" y="489" text-anchor="middle" class="bartext">G1 发射16项</text>
|
||||||
|
<rect x="980" y="462" width="165" height="42" rx="4" class="compute"/>
|
||||||
|
<text x="1062" y="489" text-anchor="middle" class="bartext">G2 发射16项</text>
|
||||||
|
<rect x="1145" y="462" width="165" height="42" rx="4" class="compute"/>
|
||||||
|
<text x="1227" y="489" text-anchor="middle" class="bartext">G3 发射16项</text>
|
||||||
|
<rect x="1310" y="462" width="195" height="42" rx="4" class="compute"/>
|
||||||
|
<text x="1407" y="489" text-anchor="middle" class="bartext">... 末组</text>
|
||||||
|
|
||||||
|
<!-- Results and retirement -->
|
||||||
|
<rect x="690" y="542" width="165" height="42" rx="4" class="result"/>
|
||||||
|
<text x="772" y="569" text-anchor="middle" class="bartext">G0 C[0..15]</text>
|
||||||
|
<rect x="855" y="542" width="165" height="42" rx="4" class="result"/>
|
||||||
|
<text x="937" y="569" text-anchor="middle" class="bartext">G1 C[0..15]</text>
|
||||||
|
<rect x="1020" y="542" width="165" height="42" rx="4" class="result"/>
|
||||||
|
<text x="1102" y="569" text-anchor="middle" class="bartext">G2 C[0..15]</text>
|
||||||
|
<rect x="1185" y="542" width="320" height="42" rx="4" class="result"/>
|
||||||
|
<text x="1345" y="569" text-anchor="middle" class="bartext">G3 ... G4999;完成即退休</text>
|
||||||
|
|
||||||
|
<!-- CRC decoupling -->
|
||||||
|
<rect x="690" y="622" width="815" height="42" rx="4" class="crc"/>
|
||||||
|
<text x="1097" y="649" text-anchor="middle" class="bartext">每个66位C元素入FIFO;队列接近阈值时反压乘加发射</text>
|
||||||
|
<rect x="710" y="702" width="925" height="42" rx="4" class="crc"/>
|
||||||
|
<text x="1172" y="729" text-anchor="middle" class="bartext">递归CRC32:每个元素分两步处理,共12字节;末组之后继续排空</text>
|
||||||
|
|
||||||
|
<!-- Disabled writeback -->
|
||||||
|
<rect x="470" y="782" width="1165" height="42" rx="4" class="disabled"/>
|
||||||
|
<line x1="485" y1="815" x2="1620" y2="791" stroke="#8a949e" stroke-width="2"/>
|
||||||
|
<text x="1052" y="809" text-anchor="middle" class="bartext" fill="#68737d">快速通道:跳过192 B/组的C结果写回(标准模式才启用)</text>
|
||||||
|
|
||||||
|
<!-- Dependency arrows -->
|
||||||
|
<path d="M 645 264 L 670 302" class="arrow"/>
|
||||||
|
<path d="M 825 264 L 850 382" class="arrow"/>
|
||||||
|
<path d="M 815 504 L 835 542" class="arrow"/>
|
||||||
|
<path d="M 855 584 L 875 622" class="arrow"/>
|
||||||
|
<path d="M 1505 584 L 1550 702" class="arrow"/>
|
||||||
|
<path d="M 1635 723 L 1660 184" class="arrow"/>
|
||||||
|
|
||||||
|
<!-- Legend -->
|
||||||
|
<g transform="translate(42 884)">
|
||||||
|
<rect x="0" y="-17" width="28" height="20" class="load"/><text x="38" y="0" class="small">ExtRAM到Bank装载</text>
|
||||||
|
<rect x="220" y="-17" width="28" height="20" class="compute"/><text x="258" y="0" class="small">乘加计算</text>
|
||||||
|
<rect x="410" y="-17" width="28" height="20" class="result"/><text x="448" y="0" class="small">C结果/退休</text>
|
||||||
|
<rect x="600" y="-17" width="28" height="20" class="crc"/><text x="638" y="0" class="small">CRC缓冲与更新</text>
|
||||||
|
<rect x="835" y="-17" width="28" height="20" class="disabled"/><text x="873" y="0" class="small">快速模式禁用路径</text>
|
||||||
|
<text x="1160" y="0" class="small" fill="#52606d">系统时钟:50 MHz</text>
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 11 KiB |
@@ -48,3 +48,7 @@
|
|||||||
\newcommand{\MatmulBoardMaxMs}{6.950307}
|
\newcommand{\MatmulBoardMaxMs}{6.950307}
|
||||||
\newcommand{\MatmulScore}{96.54\%}
|
\newcommand{\MatmulScore}{96.54\%}
|
||||||
\newcommand{\MatmulCrcStatus}{PASS}
|
\newcommand{\MatmulCrcStatus}{PASS}
|
||||||
|
\newcommand{\MatmulFinalMs}{4.911765}
|
||||||
|
\newcommand{\MatmulFinalScore}{100.00\%}
|
||||||
|
\newcommand{\MatmulFinalSeed}{\texttt{0xa3772ec8}}
|
||||||
|
\newcommand{\MatmulFinalCRC}{\texttt{0x0417d761}}
|
||||||
|
|||||||
Binary file not shown.
@@ -20,6 +20,7 @@
|
|||||||
\usepackage{multirow}
|
\usepackage{multirow}
|
||||||
\usepackage{array}
|
\usepackage{array}
|
||||||
\usepackage{xcolor}
|
\usepackage{xcolor}
|
||||||
|
\usepackage[normalem]{ulem}
|
||||||
|
|
||||||
% ---- Page style ----
|
% ---- Page style ----
|
||||||
\setlength{\headheight}{14pt}
|
\setlength{\headheight}{14pt}
|
||||||
@@ -63,31 +64,32 @@
|
|||||||
\begin{titlepage}
|
\begin{titlepage}
|
||||||
\thispagestyle{empty}
|
\thispagestyle{empty}
|
||||||
\begin{center}
|
\begin{center}
|
||||||
\vspace*{2cm}
|
|
||||||
|
|
||||||
\includegraphics[width=0.45\textwidth]{logo_cicc.png}
|
\vspace*{30pt}
|
||||||
|
|
||||||
\vspace{1.5cm}
|
\includegraphics[width=0.45\textwidth]{logo_cicc.png}
|
||||||
|
|
||||||
{\LARGE\heiti 系统设计报告}
|
\vspace{36pt}
|
||||||
|
|
||||||
\vspace{0.8cm}
|
{\fontsize{22pt}{28pt}\selectfont\bfseries 第十届}
|
||||||
|
|
||||||
{\Large\heiti 基于龙芯SoC的后量子密码与矩阵运算加速系统}
|
\vspace{4pt}
|
||||||
|
|
||||||
\vspace{2.0cm}
|
{\fontsize{22pt}{28pt}\selectfont\bfseries 全国大学生集成电路创新创业大赛}
|
||||||
|
|
||||||
\begin{tabular}{rl}
|
|
||||||
\textbf{参赛队伍:} & \underline{\hspace{5cm}} \\
|
|
||||||
\textbf{赛\quad{}题:} & \underline{龙芯中科杯} \\
|
|
||||||
\textbf{竞赛名称:} & \underline{CICIEC 2026 第十届全国大学生集成电路创新创业大赛} \\
|
|
||||||
\textbf{所属赛区:} & \underline{\hspace{5cm}} \\
|
|
||||||
\textbf{提交日期:} & \underline{2026年7月} \\
|
|
||||||
\textbf{文档版本:} & \underline{\EvidenceRevision{} — \EvidenceDate{}} \\
|
|
||||||
\end{tabular}
|
|
||||||
|
|
||||||
\vfill
|
|
||||||
\end{center}
|
\end{center}
|
||||||
|
|
||||||
|
\vspace{80pt}
|
||||||
|
|
||||||
|
\begin{flushleft}
|
||||||
|
\fontsize{14pt}{22pt}\selectfont
|
||||||
|
报告类型:\uline{\hfill 系统设计报告\hfill} \\[18pt]
|
||||||
|
参赛杯赛:\uline{\hfill 龙芯中科杯\hfill} \\[18pt]
|
||||||
|
作品名称:\uline{\hfill 基于LoongArch SoC 的后量子密码与矩阵运算加速系统\hfill} \\[18pt]
|
||||||
|
队伍编号:\uline{\hfill CICC1008439\hfill} \\[18pt]
|
||||||
|
团队名称:\uline{\hfill 碳基生物\hfill}
|
||||||
|
\end{flushleft}
|
||||||
|
|
||||||
\end{titlepage}
|
\end{titlepage}
|
||||||
|
|
||||||
% ===========================================================================
|
% ===========================================================================
|
||||||
@@ -96,6 +98,136 @@
|
|||||||
\tableofcontents
|
\tableofcontents
|
||||||
\newpage
|
\newpage
|
||||||
|
|
||||||
|
% ===========================================================================
|
||||||
|
% CORE HIGHLIGHTS PREVIEW
|
||||||
|
% ===========================================================================
|
||||||
|
\section*{作品核心亮点预览}
|
||||||
|
\addcontentsline{toc}{section}{作品核心亮点预览}
|
||||||
|
|
||||||
|
\begin{center}
|
||||||
|
{\large\heiti 基于OpenLA500的多加速器异构SoC与全参数ML-KEM硬件实现}
|
||||||
|
\end{center}
|
||||||
|
|
||||||
|
\noindent
|
||||||
|
\colorbox{blue!7}{%
|
||||||
|
\parbox{\dimexpr\textwidth-2\fboxsep\relax}{%
|
||||||
|
本作品面向龙芯中科杯矩阵运算与后量子密码任务,在赛事基础SoC之上完成DMA、矩阵乘法、FFT、ML-KEM、跨时钟域互连和批量调度等硬件扩展,并对外部SRAM控制器进行连续突发优化。系统以CPU负责配置与验证、硬件负责搬运与计算为基本分工,实现从算法IP到板级应用的完整数据通路。
|
||||||
|
}%
|
||||||
|
}
|
||||||
|
|
||||||
|
\begin{center}
|
||||||
|
\includegraphics[width=0.70\textwidth]{system_arch.png}
|
||||||
|
|
||||||
|
{\small 系统总体架构:CPU控制面、DMA数据面与三个计算加速器通过AXI互连协同工作}
|
||||||
|
\end{center}
|
||||||
|
|
||||||
|
\noindent
|
||||||
|
\begin{minipage}[t]{0.48\textwidth}
|
||||||
|
{\color{blue!70!black}\heiti 硬件自主的数据搬运与调度}
|
||||||
|
|
||||||
|
\small 四通道DMA支持内存到内存、内存到端点和端点到内存传输。矩阵批量序列器将CPU的一次启动扩展为5000组任务的硬件自主执行,双Bank机制重叠ExtRAM加载与乘加计算。
|
||||||
|
\end{minipage}
|
||||||
|
\hfill
|
||||||
|
\begin{minipage}[t]{0.48\textwidth}
|
||||||
|
{\color{blue!70!black}\heiti Matmul批量流水与在线校验}
|
||||||
|
|
||||||
|
\small 4个无符号乘法器配合两级加法树产生66位结果,稳态每周期发射一个矩阵元素。CRC结果FIFO解耦乘加与递归CRC32,快速通道跳过结果写回并在CRC完全排空后置位完成标志。
|
||||||
|
\end{minipage}
|
||||||
|
|
||||||
|
\vspace{0.6em}
|
||||||
|
|
||||||
|
\noindent
|
||||||
|
\begin{minipage}[t]{0.48\textwidth}
|
||||||
|
{\color{blue!70!black}\heiti 单比特流全参数ML-KEM}
|
||||||
|
|
||||||
|
\small 单一硬件实例运行时支持ML-KEM-512、768和1024,以及KeyGen、Encaps和Decaps三种操作。Keccak核跨哈希与采样阶段复用,Decaps重加密复用Encaps数据通路,并实现常量时间隐式拒绝。
|
||||||
|
\end{minipage}
|
||||||
|
\hfill
|
||||||
|
\begin{minipage}[t]{0.48\textwidth}
|
||||||
|
{\color{blue!70!black}\heiti 存储与多时钟域协同优化}
|
||||||
|
|
||||||
|
\small SRAM控制器通过读地址预驱动、读数据寄存和连续写握手,将突发内部吞吐提高至每周期一个32位数据拍。CPU、系统与ML-KEM三个异步时钟域通过全五通道AXI双时钟FIFO安全连接。
|
||||||
|
\end{minipage}
|
||||||
|
|
||||||
|
\vfill
|
||||||
|
\noindent
|
||||||
|
\colorbox{gray!12}{%
|
||||||
|
\parbox{\dimexpr\textwidth-2\fboxsep\relax}{%
|
||||||
|
\small\textbf{自主设计边界:}OpenLA500处理器、板级SRAM器件及基础外设来自赛事平台;DMA扩展、矩阵乘法与批量序列器、FFT、ML-KEM、跨时钟域桥接以及SRAM控制器的突发流水化改造由本项目完成。
|
||||||
|
}%
|
||||||
|
}
|
||||||
|
|
||||||
|
\newpage
|
||||||
|
|
||||||
|
\section*{关键指标与验证结论}
|
||||||
|
|
||||||
|
\begin{center}
|
||||||
|
\setlength{\tabcolsep}{4pt}
|
||||||
|
\renewcommand{\arraystretch}{1.25}
|
||||||
|
\begin{tabular}{>{\centering\arraybackslash}p{0.23\textwidth}>{\centering\arraybackslash}p{0.23\textwidth}>{\centering\arraybackslash}p{0.23\textwidth}>{\centering\arraybackslash}p{0.23\textwidth}}
|
||||||
|
{\Large\heiti \MatmulFinalMs{} ms} &
|
||||||
|
{\Large\heiti \FftDmaSpeedup{}$\times$} &
|
||||||
|
{\Large\heiti 48.95--53.33$\times$} &
|
||||||
|
{\Large\heiti 0 DSP} \\
|
||||||
|
Matmul 5000组最终时间 &
|
||||||
|
FFT DMA相对软件加速 &
|
||||||
|
ML-KEM DMA相对软件加速 &
|
||||||
|
全系统DSP使用量 \\
|
||||||
|
\end{tabular}
|
||||||
|
\end{center}
|
||||||
|
|
||||||
|
\vspace{0.5em}
|
||||||
|
\noindent{\large\heiti 核心性能结果}
|
||||||
|
|
||||||
|
\begin{center}
|
||||||
|
\small
|
||||||
|
\setlength{\tabcolsep}{5pt}
|
||||||
|
\renewcommand{\arraystretch}{1.28}
|
||||||
|
\begin{tabular}{p{2.4cm}p{7.0cm}p{4.7cm}}
|
||||||
|
\toprule
|
||||||
|
项目 & 实测结果 & 结论 \\
|
||||||
|
\midrule
|
||||||
|
矩阵乘法 & 最终评测完成5000组计算;运行时间\MatmulFinalMs{} ms & CRC32匹配,得分\MatmulFinalScore{} \\
|
||||||
|
FFT & DMA模式延迟\FftDmaNs{} ns;实部/虚部最大误差为1/2 & 相对软件加速\FftDmaSpeedup{}$\times$ \\
|
||||||
|
ML-KEM & 三等级完整往返为52,995/80,643/113,261个CPU周期 & DMA相对软件加速48.95--53.33$\times$ \\
|
||||||
|
SRAM接口 & 50 MHz、32位,连续突发每周期一个数据拍 & 理论单向带宽200 MB/s \\
|
||||||
|
\bottomrule
|
||||||
|
\end{tabular}
|
||||||
|
\end{center}
|
||||||
|
|
||||||
|
\noindent{\large\heiti FPGA实现质量}
|
||||||
|
|
||||||
|
\begin{center}
|
||||||
|
\small
|
||||||
|
\setlength{\tabcolsep}{5pt}
|
||||||
|
\renewcommand{\arraystretch}{1.25}
|
||||||
|
\begin{tabular}{p{3.0cm}p{5.3cm}p{5.8cm}}
|
||||||
|
\toprule
|
||||||
|
维度 & 结果 & 工程含义 \\
|
||||||
|
\midrule
|
||||||
|
资源 & 55,066 LUT,31,000 FF,29.5 BRAM Tile,0 DSP & LUT 41.16\%,BRAM 8.08\%,保留进一步扩展空间 \\
|
||||||
|
时钟与时序 & 33.333/50.000/76.923 MHz;88,843个端点零违例 & CPU、系统总线和ML-KEM算法域独立收敛 \\
|
||||||
|
标准验证 & 9000个主路径KAT与300个隐式拒绝向量通过 & 覆盖三等级、三操作及Decaps拒绝路径 \\
|
||||||
|
板级验证 & ML-KEM 900次运行零失败;FFT 6次通过;Matmul最终评测满分 & 验证CPU、DMA、CDC、SRAM和加速器端到端协同 \\
|
||||||
|
\bottomrule
|
||||||
|
\end{tabular}
|
||||||
|
\end{center}
|
||||||
|
|
||||||
|
\vfill
|
||||||
|
\noindent
|
||||||
|
\colorbox{green!8}{%
|
||||||
|
\parbox{\dimexpr\textwidth-2\fboxsep\relax}{%
|
||||||
|
\textbf{总体结论:}系统在xc7a200tfbg676-1 FPGA上完成布局布线,以零DSP实现矩阵运算、FFT和全参数ML-KEM硬件加速;功能正确性、跨时钟域可靠性和板级端到端性能均得到验证。
|
||||||
|
}%
|
||||||
|
}
|
||||||
|
|
||||||
|
\vspace{0.6em}
|
||||||
|
\begin{flushright}
|
||||||
|
\small 数据基线:\EvidenceRevision{},\EvidenceDate{}
|
||||||
|
\end{flushright}
|
||||||
|
|
||||||
|
\newpage
|
||||||
|
|
||||||
% ===========================================================================
|
% ===========================================================================
|
||||||
% 1. INTRODUCTION
|
% 1. INTRODUCTION
|
||||||
% ===========================================================================
|
% ===========================================================================
|
||||||
@@ -105,19 +237,19 @@
|
|||||||
|
|
||||||
随着量子计算技术的快速发展,传统公钥密码体系面临严峻挑战。美国国家标准与技术研究院于2024年正式发布的FIPS 203标准确立了ML-KEM作为后量子密钥封装机制的地位,标志着后量子密码从学术研究向工业应用的转折点。与此同时,矩阵乘法作为科学计算、信号处理与机器学习的基础运算,其硬件加速在嵌入式计算场景中具有广泛需求。本届集成电路创新创业大赛龙芯中科杯赛题要求参赛者在OpenLA500处理器平台上,设计并实现包含矩阵乘法加速器与ML-KEM密码IP的完整SoC系统,在资源受限的FPGA器件上同时满足功能正确性与性能要求。
|
随着量子计算技术的快速发展,传统公钥密码体系面临严峻挑战。美国国家标准与技术研究院于2024年正式发布的FIPS 203标准确立了ML-KEM作为后量子密钥封装机制的地位,标志着后量子密码从学术研究向工业应用的转折点。与此同时,矩阵乘法作为科学计算、信号处理与机器学习的基础运算,其硬件加速在嵌入式计算场景中具有广泛需求。本届集成电路创新创业大赛龙芯中科杯赛题要求参赛者在OpenLA500处理器平台上,设计并实现包含矩阵乘法加速器与ML-KEM密码IP的完整SoC系统,在资源受限的FPGA器件上同时满足功能正确性与性能要求。
|
||||||
|
|
||||||
本设计的核心目标是在Xilinx Artix-7 xc7a200tfbg676-1 FPGA器件上构建一个功能完整的异构计算SoC系统,具体包括三项设计内容。第一,设计一个支持4x4无符号矩阵乘法的硬件加速器,不使用DSP资源,完成5000组矩阵计算的批量处理任务,并通过CRC32校验结果正确性。第二,根据FIPS 203标准实现全参数可配置的ML-KEM硬件IP,覆盖ML-KEM-512、ML-KEM-768与ML-KEM-1024三个安全等级,支持密钥生成、封装与解封装全部三种操作。第三,设计通用DMA子系统与批量任务调度器,将多个计算加速器有机集成到统一的AXI总线架构中,实现CPU控制、DMA搬运与加速器计算的流水化协同。
|
本设计的核心目标是在Xilinx Artix-7 xc7a200tfbg676-1 FPGA器件上构建一个功能完整的异构计算SoC系统,具体包括四项设计内容。第一,设计一个支持4x4无符号矩阵乘法的硬件加速器,不使用DSP资源,完成5000组矩阵计算的批量处理任务,并通过CRC32校验结果正确性。第二,根据FIPS 203标准实现全参数可配置的ML-KEM硬件IP,覆盖ML-KEM-512、ML-KEM-768与ML-KEM-1024三个安全等级,支持密钥生成、封装与解封装全部三种操作。第三,设计通用DMA子系统与批量任务调度器,将多个计算加速器有机集成到统一的AXI总线架构中,实现CPU控制、DMA搬运与加速器计算的流水化协同。第四,在赛事基础SoC提供的外部SRAM控制器上优化AXI突发读写时序,使BaseRAM和ExtRAM能够在连续传输期间以每个系统时钟周期一个32位数据拍的速率工作,降低程序取指与加速器批量搬运共享存储器时的接口开销。
|
||||||
|
|
||||||
\subsection{设计原则与创新点}
|
\subsection{设计原则与创新点}
|
||||||
|
|
||||||
系统设计遵循四条基本原则。第一条原则是模块化分离原则。将矩阵乘法、FFT和ML-KEM三个计算加速器设计为相互独立的AXI外设,各自拥有独立的地址空间、控制寄存器和中断通道,使得每个加速器可单独验证、单独优化,系统集成时仅通过跨时钟域隔离与地址解码完成互连。第二条原则是资源复用原则。ML-KEM内部算法涉及Keccak-f[1600]置换、SHA3/SHAKE哈希族、NTT数论变换、Barrett模乘、CBD中心二项分布采样以及压缩解压缩等多种运算算子。设计中采用单个Keccak核在顶层有限状态机的时间分片调度下被SHA3/SHAKE、SampleNTT和CBD三个消费者分时复用,NTT正变换与逆变换共享同一组蝶形单元流水线,解封装流程中的重加密阶段直接复用封装状态序列。第三条原则是数据搬运与计算解耦原则。通用DMA子系统独立于计算加速器,通过内存到设备、设备到内存以及设备本地端点三种传输模式,将数据搬运从CPU寄存器逐字读写中解放出来,使计算流水线的瓶颈从总线事务转移到算术吞吐率。第四条原则是批量调度与双缓冲原则。矩阵乘法批量序列器通过双Bank乒乓机制,将批量任务调度、数据加载、计算启动与结果写回四个阶段完全流水化,一个Bank执行计算时另一个Bank进行数据加载或结果写回,从而隐藏ExtRAM访问延迟。
|
系统设计遵循五条基本原则。第一条原则是模块化分离原则。将矩阵乘法、FFT和ML-KEM三个计算加速器设计为相互独立的AXI外设,各自拥有独立的地址空间、控制寄存器和中断通道,使得每个加速器可单独验证、单独优化,系统集成时仅通过跨时钟域隔离与地址解码完成互连。第二条原则是资源复用原则。ML-KEM内部算法涉及Keccak-f[1600]置换、SHA3/SHAKE哈希族、NTT数论变换、Barrett模乘、CBD中心二项分布采样以及压缩解压缩等多种运算算子。设计中采用单个Keccak核在顶层有限状态机的时间分片调度下被SHA3/SHAKE、SampleNTT和CBD三个消费者分时复用,NTT正变换与逆变换共享同一组蝶形单元流水线,解封装流程中的重加密阶段直接复用封装状态序列。第三条原则是数据搬运与计算解耦原则。通用DMA子系统独立于计算加速器,通过内存到设备、设备到内存以及设备本地端点三种传输模式,将数据搬运从CPU寄存器逐字读写中解放出来,使计算流水线的瓶颈从总线事务转移到算术吞吐率。第四条原则是批量调度与双缓冲原则。矩阵乘法批量序列器通过双Bank乒乓机制,将批量任务调度、数据加载、计算启动与结果写回四个阶段完全流水化,一个Bank执行计算时另一个Bank进行数据加载或结果写回,从而隐藏ExtRAM访问延迟。第五条原则是存储接口节拍匹配原则。外部异步SRAM控制器在满足地址建立与数据保持时间的前提下,将AXI地址、SRAM访问和AXI响应组织为连续流水,使32位AXI数据拍与50 MHz系统时钟逐拍对应,避免控制状态机在突发数据拍之间引入结构性空闲周期。
|
||||||
|
|
||||||
本设计的主要创新点体现在三个方面。首先,提出了一套高效的跨时钟域互连方案,在CPU时钟域、系统总线时钟域和ML-KEM算法时钟域之间采用全五通道AXI双时钟FIFO进行时钟域隔离,同时配合严格的异步复位释放链和中断同步器,在保持各时钟域独立约束的前提下保证了数据与控制信号的可靠传递。其次,针对竞争评分机制对批量处理延迟的极致要求,设计了快速通道模式,在保证CRC32增量计算正确性的前提下跳过每组结果的逐字写回,将批量矩阵乘法的端到端延迟推进到毫秒量级。最后,ML-KEM解封装中的隐式拒绝路径采用了常量时间比较策略,整个重加密密文与输入密文的逐字节比对不进行提前退出,从根本上杜绝了时序侧信道信息泄露,这是后量子密码实现中至关重要的安全设计考量。
|
本设计的主要创新点体现在四个方面。首先,提出了一套高效的跨时钟域互连方案,在CPU时钟域、系统总线时钟域和ML-KEM算法时钟域之间采用全五通道AXI双时钟FIFO进行时钟域隔离,同时配合严格的异步复位释放链和中断同步器,在保持各时钟域独立约束的前提下保证了数据与控制信号的可靠传递。其次,对赛事基础平台的外部SRAM控制器进行突发访问流水化改造,通过读地址预驱动、读数据寄存、连续写握手和跨突发无空闲衔接,提高了CPU与DMA共享存储器的有效带宽。再次,针对竞争评分机制对批量处理延迟的极致要求,设计了快速通道模式,在保证CRC32增量计算正确性的前提下跳过每组结果的逐字写回,将批量矩阵乘法的端到端延迟推进到毫秒量级。最后,ML-KEM解封装中的隐式拒绝路径采用了常量时间比较策略,整个重加密密文与输入密文的逐字节比对不进行提前退出,从根本上杜绝了时序侧信道信息泄露,这是后量子密码实现中至关重要的安全设计考量。
|
||||||
|
|
||||||
\subsection{代码规模与开发环境}
|
\subsection{代码规模与开发环境}
|
||||||
|
|
||||||
本设计的基础SoC平台来自龙芯中科提供的竞赛发布包,其核心处理器为OpenLA500。OpenLA500是一款实现了龙芯架构32位精简版指令集(LoongArch32R)的处理器核,采用单发射五级流水线架构,分为取指、译码、执行、访存和写回五个流水级。处理器核内置两路组相联的指令和数据Cache、32项TLB以及简易分支预测器,对外通过标准AXI接口与系统总线互连。该处理器已在0.13微米工艺下完成流片验证,实测频率100 MHz时的Dhrystone分数为0.78 DMIPS/MHz,CoreMark分数为2.75 CoreMark/MHz。在软件生态方面,U-Boot、Linux 5.14、UCore和RT-Thread等常用系统软件已完成对该处理器的适配。
|
本设计的基础SoC平台来自龙芯中科提供的竞赛发布包,其核心处理器为OpenLA500。OpenLA500是一款实现了龙芯架构32位精简版指令集(LoongArch32R)的处理器核,采用单发射五级流水线架构,分为取指、译码、执行、访存和写回五个流水级。处理器核内置两路组相联的指令和数据Cache、32项TLB以及简易分支预测器,对外通过标准AXI接口与系统总线互连。
|
||||||
|
|
||||||
系统RTL代码采用SystemVerilog编写,覆盖SoC顶层集成、三个计算加速器及其子模块、DMA子系统、跨时钟域桥接模块以及相关的仿真测试平台。软件部分包括运行于OpenLA500 CPU上的C语言驱动程序和测试程序,涵盖矩阵乘法评测、FFT功能验证以及ML-KEM全参数系统级诊断测试。FPGA综合与布局布线使用Xilinx Vivado 2019.2工具链完成,目标器件为xc7a200tfbg676-1。RTL仿真采用Xilinx XSIM进行波形验证与定时仿真,软件交叉编译使用龙芯GCC工具链(loongarch32r-linux-gnusf-gcc 8.3)生成MIPS32可执行文件。RTL静态检查通过开源lint工具完成。
|
系统RTL代码采用Verilog与SystemVerilog编写,覆盖SoC顶层集成、三个计算加速器及其子模块、DMA子系统、跨时钟域桥接模块、外部SRAM控制器优化以及相关的仿真测试平台。软件部分包括运行于OpenLA500 CPU上的C语言驱动程序和测试程序,涵盖矩阵乘法评测、FFT功能验证以及ML-KEM全参数系统级诊断测试。FPGA综合与布局布线使用Xilinx Vivado 2019.2工具链完成,目标器件为xc7a200tfbg676-1。RTL功能仿真采用Xilinx XSIM进行结果比对与波形验证,软件交叉编译使用龙芯GCC工具链(loongarch32r-linux-gnusf-gcc 8.3)生成LoongArch32R裸机可执行文件。
|
||||||
|
|
||||||
|
|
||||||
% ===========================================================================
|
% ===========================================================================
|
||||||
@@ -205,7 +337,7 @@ ML-KEM到CPU的中断信号属于单比特状态信号,从ML-KEM算法时钟
|
|||||||
|
|
||||||
这种分层功能划分使系统行为在验证时具有良好的可观测性与可调试性。任何一个加速器的功能正确性可以通过软件层切换至寄存器逐字读写模式进行独立步进验证,然后再通过DMA批量模式验证完整流水线的高性能运行。ML-KEM的功能验证在三种数据传输路径下分别进行了测试:纯软件参考模型路径用于确认算法逻辑正确性,CPU寄存器逐字节加载路径用于验证AXI从设备接口与跨时钟域的数据通路完整性,DMA批量窗口路径用于验证端到端系统级数据流与性能。
|
这种分层功能划分使系统行为在验证时具有良好的可观测性与可调试性。任何一个加速器的功能正确性可以通过软件层切换至寄存器逐字读写模式进行独立步进验证,然后再通过DMA批量模式验证完整流水线的高性能运行。ML-KEM的功能验证在三种数据传输路径下分别进行了测试:纯软件参考模型路径用于确认算法逻辑正确性,CPU寄存器逐字节加载路径用于验证AXI从设备接口与跨时钟域的数据通路完整性,DMA批量窗口路径用于验证端到端系统级数据流与性能。
|
||||||
|
|
||||||
矩阵乘法评测程序在功能上进一步体现了软硬件协作的设计思想。CPU负责配置序列器的源基地址、目标基地址、任务组数以及跨步参数,然后启动序列器。序列器作为纯硬件模块接管后续的全部5000组数据处理:逐一申请DMA通道完成源矩阵从ExtRAM到加速器Bank缓冲区的加载,触发计算,等待完成脉冲,申请DMA通道完成结果矩阵从加速器Bank缓冲区到ExtRAM的写回,并以增量方式实时更新CRC32校验值。CPU在所有组任务完成信号触发后,仅需从加速器的CRC32寄存器读取最终校验值并通过串口输出,数据的完整搬运与计算路径完全由硬件流水线独立执行。这种软件配置加硬件执行的划分模式最大化地降低了对CPU吞吐能力的依赖,使性能瓶颈从CPU的寄存器访问延迟转移到硬件加速器与DMA之间的数据搬运吞吐率。
|
矩阵乘法评测程序在功能上进一步体现了软硬件协作的设计思想。CPU负责配置序列器的源基地址、目标基地址、任务组数以及跨步参数,然后启动序列器。序列器作为纯硬件模块接管后续的全部5000组数据处理:逐一申请DMA通道完成源矩阵从ExtRAM到加速器Bank缓冲区的加载,触发计算并等待完成脉冲。标准写回模式随后申请DMA通道,将结果矩阵从加速器Bank缓冲区写回ExtRAM;官方评测采用的快速通道模式跳过该写回阶段,但矩阵核心仍按照每个66位结果元素的标准字节序增量更新CRC32。CPU在全部任务完成后读取CRC32寄存器并通过串口输出。因而,当前评测路径由源数据搬运、硬件计算和片上CRC32累加组成,ExtRAM结果区在快速通道模式下不会被更新。这种软件配置加硬件执行的划分模式最大化地降低了对CPU吞吐能力的依赖,使性能瓶颈从CPU的寄存器访问延迟转移到硬件加速器与DMA之间的数据搬运吞吐率。
|
||||||
|
|
||||||
|
|
||||||
% ===========================================================================
|
% ===========================================================================
|
||||||
@@ -228,6 +360,17 @@ DMA还提供外部请求接口,用于矩阵批量序列器直接提交DMA传
|
|||||||
\label{fig:dma_subsystem}
|
\label{fig:dma_subsystem}
|
||||||
\end{figure}
|
\end{figure}
|
||||||
|
|
||||||
|
\subsection{外部SRAM控制器优化}
|
||||||
|
\label{sec:sram_controller}
|
||||||
|
|
||||||
|
系统沿用赛事基础SoC提供的AXI到异步SRAM适配器,并针对连续突发访问重新设计其关键状态转换与数据保持路径。优化对象不是SRAM器件本身,而是AXI读写通道与BaseRAM、ExtRAM物理接口之间的控制逻辑。控制器仍保持32位数据宽度并支持FIXED、INCR和WRAP三类AXI突发,所有访问均在50 MHz系统时钟域内完成。
|
||||||
|
|
||||||
|
原始读通道在相邻数据拍之间交替进入数据响应状态和地址准备状态,即使AXI主设备始终保持\texttt{RREADY},每个数据拍后仍会产生一个固定空闲周期。优化后的快速读模式在返回当前\texttt{R}通道数据时预先驱动下一拍SRAM地址,并在当前数据完成握手的时钟沿将下一拍数据锁存到读数据寄存器。该寄存器将异步SRAM数据总线与AXI\texttt{RVALID/RREADY}握手解耦:当主设备施加反压时,\texttt{RDATA}和\texttt{RVALID}保持稳定;当主设备连续接收时,突发内部可实现每周期返回一个32位数据拍。最后一个\texttt{R}数据拍完成时,控制器还能够直接接受下一条\texttt{AR}请求并启动其地址阶段,消除了相邻读突发之间必须返回空闲状态的间隔。
|
||||||
|
|
||||||
|
写通道的优化移除了连续写数据拍之间的\texttt{WRITE\_NOP}状态。当\texttt{WVALID}连续有效时,控制器保持\texttt{WREADY}并在每个系统时钟周期更新地址、字节使能与写数据,从而由隔拍写入改为逐拍写入。地址生成逻辑使用当前地址、固定字长增量和突发边界掩码统一处理三类突发;计数器扩展为9位,以正确表达AXI4最长256拍突发的完成条件。
|
||||||
|
|
||||||
|
BaseRAM与ExtRAM的选择位由地址位22决定。优化后该选择不再直接依赖组合地址输出,而是在接收\texttt{AR}或\texttt{AW}时锁存为独立的Bank状态,并随整个事务保持不变,避免流水地址切换期间片选和读数据多路选择发生瞬态变化。在无AXI反压的理想条件下,连续读写的接口峰值带宽由原先约每两周期一个32位数据拍提高至每周期一个数据拍;在50 MHz系统时钟下,对应的理论单向带宽为200 MB/s。该数值是接口节拍上限,实际端到端性能仍受到总线仲裁、突发启动、DMA调度和计算模块反压的共同影响。
|
||||||
|
|
||||||
\subsection{矩阵乘法加速器设计}
|
\subsection{矩阵乘法加速器设计}
|
||||||
|
|
||||||
矩阵乘法加速器是本系统中逻辑结构最为紧凑的计算模块。其核心功能是计算两个4x4无符号32位整数矩阵的乘积,每个输出元素为四个32位乘积累加结果,总宽度66位。加速器内部采用双Bank结构,Bank 0和Bank 1各包含一套完整的16元素A矩阵、16元素B矩阵以及48字(16元素乘以3字每元素)C结果矩阵的存储空间。双Bank设计使得批量序列器可以实现在一个Bank执行矩阵乘法计算的同时,另一个Bank通过端点接口接收下一组矩阵数据或写出上一组计算结果,从而实现计算与数据搬运的时间重叠。
|
矩阵乘法加速器是本系统中逻辑结构最为紧凑的计算模块。其核心功能是计算两个4x4无符号32位整数矩阵的乘积,每个输出元素为四个32位乘积累加结果,总宽度66位。加速器内部采用双Bank结构,Bank 0和Bank 1各包含一套完整的16元素A矩阵、16元素B矩阵以及48字(16元素乘以3字每元素)C结果矩阵的存储空间。双Bank设计使得批量序列器可以实现在一个Bank执行矩阵乘法计算的同时,另一个Bank通过端点接口接收下一组矩阵数据或写出上一组计算结果,从而实现计算与数据搬运的时间重叠。
|
||||||
@@ -253,7 +396,18 @@ DMA还提供外部请求接口,用于矩阵批量序列器直接提交DMA传
|
|||||||
|
|
||||||
两个Bank的流水可以在时间上重叠:当Bank 0执行计算时,DMA可以同时为Bank 1执行加载或存储操作。这种重叠利用了矩阵乘法加速器的双Bank独立性与DMA引擎的独立工作能力,使得外部存储器的访问延迟被计算时间覆盖。序列器使用一个深度为二的完成队列跟踪Bank计算完成的先后顺序,确保存储操作在正确的Bank上执行。
|
两个Bank的流水可以在时间上重叠:当Bank 0执行计算时,DMA可以同时为Bank 1执行加载或存储操作。这种重叠利用了矩阵乘法加速器的双Bank独立性与DMA引擎的独立工作能力,使得外部存储器的访问延迟被计算时间覆盖。序列器使用一个深度为二的完成队列跟踪Bank计算完成的先后顺序,确保存储操作在正确的Bank上执行。
|
||||||
|
|
||||||
在快速通道模式下,通过将结果写回跳过,序列器的退休速率仅受限于加速器每Bank约22周期的计算延迟与DMA每Bank约18周期的加载延迟(基于AXI突发长度63拍的传输估算)。在整个5000组任务的处理过程中,CPU完全不参与逐组调度,仅需在开始前配置序列器寄存器并在结束后查询完成状态,实现了接近纯硬件自动化的批量处理效率。
|
图\ref{fig:matmul_gantt}以快速通道的前四组任务和末尾收尾阶段为例,给出了当前实现的数据流甘特图。图中阶段宽度用于表达先后依赖和流水重叠关系,不代表严格的周期比例。CDMA读侧仍使用单一AXI读数据通道,硬件能够保留一个活动突发和一个预取请求,以减少相邻突发之间的地址握手空隙,但两组读数据仍按请求顺序返回。双Bank的作用是在共享读通道装载下一组A/B矩阵时,让单一乘加流水线处理已经就绪的另一Bank,而不是复制两套DMA或乘加数据通路。
|
||||||
|
|
||||||
|
每个66位C元素在写入对应Bank结果缓冲区的同时进入CRC结果FIFO。递归CRC32数据通路将一个元素表示成两个6字节更新步骤,因此消费速率低于乘加流水线的峰值发射速率;FIFO吸收短期速率差,在占用量接近阈值时对新结果发射施加反压。快速通道在矩阵计算完成时退休该组任务,不发起192字节结果写回,但批量序列器只有在最后一组退休且CRC FIFO与递归更新状态均为空闲后才置位最终完成标志。
|
||||||
|
|
||||||
|
\begin{figure}[htbp]
|
||||||
|
\centering
|
||||||
|
\includegraphics[width=0.98\textwidth]{matmul_dataflow_gantt.png}
|
||||||
|
\caption{Matmul快速通道数据流甘特图}
|
||||||
|
\label{fig:matmul_gantt}
|
||||||
|
\end{figure}
|
||||||
|
|
||||||
|
在快速通道模式下,结果写回不再占用数据通路。稳态吞吐率由128字节源数据读取、单一乘加流水线以及递归CRC32消费速率共同决定:源数据读取包含32个32位数据拍,乘加流水线在无反压时可连续发射16个结果元素,而CRC32以每个元素两个更新周期的速率消费FIFO数据。当CRC积压达到阈值时,CRC结果FIFO会暂停新的乘加发射,因此不能将批量吞吐率简单等同于单个Bank的计算延迟。在整个5000组任务的处理过程中,CPU不参与逐组调度,仅需在开始前配置序列器寄存器并在结束后查询完成状态,实现了硬件自主的批量处理流程。
|
||||||
|
|
||||||
\subsection{FFT加速器设计}
|
\subsection{FFT加速器设计}
|
||||||
|
|
||||||
@@ -293,40 +447,57 @@ ML-KEM与FFT共享同一从端口的设计节省了总线互连矩阵的端口
|
|||||||
|
|
||||||
\subsection{分层验证策略}
|
\subsection{分层验证策略}
|
||||||
|
|
||||||
系统的验证工作采用分层递进策略,将验证对象从底层叶模块到顶层系统划分为四个层级,每一层级解决不同粒度的功能正确性问题。第一层级为叶模块级验证。针对每个独立的运算算子,使用定向测试与边界条件覆盖相结合的测试平台,在独立环境下验证其算术正确性与接口协议合规性。Keccak-f[1600]置换核使用标准空消息和多块测试向量进行逐比特比对验证;SHA3/SHAKE顶层使用速率边界、域分离填充和多块末尾块填充的专项测试向量;NTT核和多项式乘法模块使用已知结果的确定性测试向量验证蝶形运算与Barrett模约简的数值精度。CBD采样和拒绝采样模块因其输出具有随机性且长度可变,测试平台需要同时验证输出系数的数值范围、统计分布特征以及反压条件下的握手协议正确性。
|
系统的验证工作采用分层递进策略,将验证对象从底层叶模块到顶层系统划分为四个层级,每一层级解决不同粒度的功能正确性问题。
|
||||||
|
|
||||||
第二层级为IP集成级验证。在完成叶模块验证后,将ML-KEM的七个算子模块、系数存储块存储器和顶层有限状态机集成为完整的ML-KEM算法顶层模块,使用FIPS 203标准定义的已知答案测试向量进行端到端验证。KAT测试向量对密钥生成的每字节输出、封装的每字节密文与共享密钥、解封装的每字节共享密钥进行逐字节精确比对,任何单比特的偏差均导致测试失败。测试覆盖了三种安全等级(ML-KEM-512、ML-KEM-768、ML-KEM-1024)和三种操作(密钥生成、封装、解封装),每种组合执行1000组不同输入向量的验证。
|
第一层级为叶模块级验证,覆盖全部自研硬件模块中的独立运算单元和控制单元。对于ML-KEM算法子系统,Keccak-f[1600]置换核使用标准空消息和多块测试向量进行逐比特比对验证;SHA3/SHAKE顶层使用速率边界、域分离填充和多块末尾块填充的专项测试向量;NTT核和多项式乘法模块使用已知结果的确定性测试向量,验证蝶形运算与Barrett模约简的数值精度;CBD采样和拒绝采样模块因其输出具有随机性且长度可变,测试平台同时验证输出系数的数值范围、统计分布特征以及反压条件下的握手协议正确性。对于FFT加速器,叶模块级验证覆盖了蝶形运算单元、复数乘法器、延迟缓冲区和旋转因子只读存储器,重点验证蝶形运算中的算术右移舍入策略在各级联条件下的累积误差是否处于可控范围内,以及复数乘法器在四种乘积组合下的符号正确性。对于矩阵乘法加速器,叶模块级验证覆盖了流水化乘法器的三级流水寄存器行为、乘积结果的64位宽度正确性以及加法树归约路径的进位链完整性;CRC32计算单元使用标准IEEE 802.3已知答案测试向量独立验证其增量更新逻辑。对于DMA子系统,叶模块级验证覆盖了同步先进先出缓冲队列在满空边界条件下的读写行为、轮转仲裁器在多通道并发请求时的公平性以及AXI突发传输引擎在不同传输长度和地址对齐条件下的时序正确性。
|
||||||
|
|
||||||
第三层级为SoC集成级验证。将矩阵乘法加速器、FFT加速器、ML-KEM加速器和DMA子系统全部集成到系统顶层模块中,重点验证总线互连矩阵的地址解码正确性、多主设备并发访问的仲裁公平性、跨时钟域数据通路的传输可靠性、复位释放前后各AXI通道的事务清空情况以及中断聚合与响应的时序正确性。该层级通过短时长的XSIM系统级仿真完成,利用波形窗口观察关键时序节点,确认复位释放后CPU第一条取指事务的正常发起以及各加速器AXI接口的初始状态为空闲。
|
第二层级为IP集成级验证。ML-KEM方面,将七个算子模块、系数存储块存储器和顶层有限状态机集成为完整的算法顶层模块,使用FIPS 203标准定义的已知答案测试向量进行端到端验证,对密钥生成、封装和解封装的每字节输出进行逐字节精确比对,任何单比特的偏差均导致测试失败,测试覆盖了三种安全等级和三种操作的各1000组不同输入向量。FFT方面,将SDF流水线五级单元与控制状态机集成为完整的1024点FFT加速器,使用多组已知频率成分的合成信号作为输入,验证输出频谱的幅度正确性和位逆序到自然顺序的地址转换正确性,并以双精度浮点软件参考模型为基准,在1024个频点上逐一比较实数部和虚数部的误差。矩阵乘法方面,将双Bank数据缓冲区、四乘法器计算核心、CRC32增量更新逻辑和AXI从设备接口集成为完整的矩阵乘法加速器,使用多组已知乘积的确定性矩阵作为输入,覆盖全零边界用例、单位矩阵、满秩随机矩阵和不同矩阵维度组合,验证输出元素的66位结果与各维度的按字拆分格式的正确性。DMA方面,将四通道寄存器组、轮转仲裁器、内存到内存传输引擎和端点状态机集成为完整的DMA子系统,分别验证三种传输模式在随机地址与随机长度下的数据搬运完整性,以及端点模式中Bank编号与字偏移的地址计算正确性。
|
||||||
|
|
||||||
第四层级为板级系统验证。将经过综合、布局布线生成的比特流下载到FPGA开发板,运行CPU上的测试程序,在真实的硬件环境中验证完整的软硬件协同工作流程。板级验证覆盖了矩阵乘法评测、FFT功能正确性与性能对比、ML-KEM全参数全操作的三路径系统诊断测试,所有测试通过开发板串口输出结构化的测试结果日志。
|
第三层级为SoC集成级验证。将矩阵乘法加速器、FFT加速器、ML-KEM加速器和DMA子系统全部集成到系统顶层模块中,重点验证总线互连矩阵的地址解码正确性、多主设备并发访问的仲裁公平性、跨时钟域数据通路的传输可靠性、复位释放前后各AXI通道的事务清空情况以及中断聚合与响应的时序正确性。该层级通过短时长的XSIM系统级仿真完成,利用波形窗口观察关键时序节点,确认复位释放后CPU第一条取指事务的正常发起以及各加速器AXI接口的初始状态为空闲。该过程同时检查了CPU经SRAM控制器访问BaseRAM的取指通路。
|
||||||
|
|
||||||
|
第四层级为板级系统验证。将经过综合、布局布线生成的比特流下载到FPGA开发板,运行CPU上的测试程序,在真实的硬件环境中验证完整的软硬件协同工作流程。板级验证覆盖了矩阵乘法评测、FFT功能正确性与性能对比、ML-KEM全参数全操作的三路径系统诊断测试,所有测试通过开发板串口输出结构化的测试结果日志。这些测试均依赖BaseRAM执行程序并通过ExtRAM或加速器窗口搬运批量数据,因而也对优化后SRAM控制器的连续读写、Bank选择和长时间运行稳定性形成了端到端覆盖。
|
||||||
|
|
||||||
\subsection{验证工具链与环境}
|
\subsection{验证工具链与环境}
|
||||||
|
|
||||||
RTL仿真使用Xilinx XSIM作为仿真引擎,通过Tcl脚本管理仿真流程。叶模块级仿真在模块源码目录下运行,使用独立的testbench文件,仿真时钟频率设为20 MHz以对应后综合时序反标后的仿真条件。SoC集成级仿真在系统顶层目录下运行,仿真时钟直接使用PLL产生的三个时钟域频率。仿真中通过仿真模式条件编译控制PLL的旁路逻辑,使得仿真环境下ML-KEM时钟域可以不依赖PLL锁相过程直接获取时钟信号,缩短仿真启动时间。仿真复位窗口的波形数据通过VCD格式导出,用于精确观测复位释放时序和验证复位释放前AXI通道上不存在未完成事务。
|
RTL仿真使用Xilinx XSIM作为仿真引擎,通过Tcl脚本管理仿真流程。叶模块级仿真在模块源码目录下运行,使用独立的testbench文件;ML-KEM顶层KAT仿真的测试时钟为20 MHz,周期统计据此换算为仿真时间。SoC集成级仿真在系统顶层目录下运行,使用仿真时钟模型产生各时钟域信号。仿真中通过条件编译旁路真实PLL锁相过程,以缩短仿真启动时间。复位窗口的波形数据通过VCD格式导出,用于观测复位释放时序和验证复位释放前AXI通道上不存在未完成事务。上述测试属于RTL功能仿真,不包含门级延迟或SDF反标。
|
||||||
|
|
||||||
FPGA综合与实现使用Vivado 2019.2完整流程。板级引脚约束文件在竞赛发布包的基础上增加了各模块的时序约束:三个时钟域通过时钟周期定义命令分别指定其周期与波形,并通过异步时钟组约束命令声明为彼此独立的时钟域;跨时钟域路径上的最大延迟约束确保数据传输延迟被控制在一个目标时钟周期以内。输入输出延迟约束覆盖了QSPI Flash、UART和DVI接口。Vivado工具产生的综合后网表被用于运行后综合时序仿真,以验证在接近实际硬件延迟条件下的功能正确性。
|
FPGA综合与实现使用Vivado 2019.2完整流程。时序约束为CPU、系统总线和ML-KEM三个生成时钟分别定义周期与波形,并将三者声明为异步时钟组;跨域功能正确性由AXI双时钟FIFO、单比特同步器和复位同步器的结构保证,而不是由跨域最大延迟约束保证。当前输入输出延迟约束覆盖BaseRAM和ExtRAM的数据、地址与控制信号,尚未对QSPI Flash、UART、DVI等全部板级接口建立完整的外部时序模型,因此Vivado方法学报告仍包含缺失输入输出延迟的警告。本文的静态时序结论仅适用于已约束的内部同步路径与SRAM接口,不将未完整约束的外部接口计入时序收敛结论。
|
||||||
|
|
||||||
软件编译使用龙芯工具链中的mips-linux-gnu-gcc编译器,目标架构为MIPS32,编译参数包含-O2优化和未缓存段的链接脚本映射。测试程序通过将目标可执行文件转换为二进制格式后写入BaseRAM仿真模型或FPGA板上的BaseRAM存储器。板级调试过程中利用串口输出作为主要的信息反馈通道,所有测试程序的判定结果、性能指标和错误计数均通过115200波特率的串口输出,并由上位机脚本进行解析和记录。
|
软件编译使用龙芯LoongArch32R交叉工具链中的loongarch32r-linux-gnusf-gcc 8.3编译器,目标指令集为LoongArch32R。各测试程序由其Makefile分别选择-O2或-O3优化,并采用静态裸机链接、无标准启动文件和未缓存地址映射。生成的二进制文件写入BaseRAM仿真模型或开发板BaseRAM。板级调试过程中利用串口输出作为主要的信息反馈通道,所有测试程序的判定结果、性能指标和错误计数均通过115200波特率的串口输出,并由上位机脚本进行解析和记录。
|
||||||
|
|
||||||
\subsection{验证覆盖范围}
|
\subsection{验证覆盖范围}
|
||||||
|
|
||||||
本项目验证覆盖范围的完整程度由表\ref{tab:verification}总结。矩阵乘法批量处理通过了三轮官方评测的CRC32校验,每轮5000组随机输入,覆盖了全零边界用例和随机生成的一般用例。ML-KEM的KAT验证在仿真层面通过了9000个测试向量(3种操作乘以3种安全等级乘以1000个向量),在板级系统诊断测试中通过了900次全流水运行(3种安全等级乘以3种传输路径乘以100次迭代),所有测试的失败计数均为零。
|
本项目验证覆盖范围的完整程度由表\ref{tab:verification}总结。矩阵乘法批量处理通过了三轮官方板级评测的CRC32校验,每轮使用独立随机种子生成5000组输入。ML-KEM算法子系统的已知答案测试在仿真层面通过了9000个主路径测试向量(三种操作乘以三种安全等级乘以1000个向量),并通过了300个Decaps隐式拒绝路径向量(三种安全等级各100个向量);在板级系统诊断测试中通过了900次全流水运行(三种安全等级乘以三种传输路径乘以100次迭代),所有测试的失败计数均为零。FFT加速器在板级上通过了两类数据传输模式(CPU逐字读写和DMA批量传输)各三次重复运行的功能正确性和数值精度验证,1024个频点的实数部与虚数部最大误差均低于预定阈值。DMA子系统在板级系统诊断测试中作为ML-KEM和FFT的数据搬运通路被间接验证了三种传输模式的完整性,同时其四通道轮转调度和端点传输的正确性通过矩阵批量序列器的5000组流水任务得到了充分覆盖。上述板级负载均运行在优化后的SRAM控制器之上,覆盖CPU从BaseRAM持续取指以及DMA从ExtRAM执行长突发读取的实际使用场景。
|
||||||
|
|
||||||
\begin{table}[H]
|
\begin{table}[H]
|
||||||
\centering
|
\centering
|
||||||
|
\setlength{\tabcolsep}{5pt}
|
||||||
\caption{功能验证覆盖摘要}
|
\caption{功能验证覆盖摘要}
|
||||||
\label{tab:verification}
|
\label{tab:verification}
|
||||||
\begin{tabular}{p{3.8cm}ccc}
|
\begin{tabular}{p{4.5cm}ccc}
|
||||||
\toprule
|
\toprule
|
||||||
验证项 & 测试规模 & 通过/总计 & 结果 \\
|
验证项 & 测试规模 & 通过/总计 & 结果 \\
|
||||||
\midrule
|
\midrule
|
||||||
矩阵乘法CRC32(仿真) & 3轮 × 5000组 & 3 / 3 & 通过 \\
|
矩阵乘法叶模块(乘法器、CRC32) & 确定性向量 & — & 通过 \\
|
||||||
|
FFT叶模块(蝶形单元、复数乘法器) & 定向测试 & — & 通过 \\
|
||||||
|
DMA叶模块(FIFO、仲裁器、引擎) & 定向测试 & — & 通过 \\
|
||||||
|
ML-KEM叶模块(Keccak、NTT、采样等) & 标准测试向量 & — & 通过 \\
|
||||||
|
\midrule
|
||||||
|
矩阵乘法IP集成(仿真) & 多组确定矩阵 & — & 通过 \\
|
||||||
|
FFT IP集成(仿真) & 合成测试信号 & — & 通过 \\
|
||||||
|
DMA IP集成(仿真) & 随机地址/长度 & — & 通过 \\
|
||||||
ML-KEM KAT(仿真) & 9组 × 1000向量 & 9 / 9 & 通过 \\
|
ML-KEM KAT(仿真) & 9组 × 1000向量 & 9 / 9 & 通过 \\
|
||||||
ML-KEM 系统诊断(板级) & 9组 × 100次迭代 & 9 / 9 & 通过 \\
|
ML-KEM隐式拒绝(仿真) & 3组 × 100向量 & 3 / 3 & 通过 \\
|
||||||
|
\midrule
|
||||||
|
矩阵乘法CRC32(官方板级评测) & 3轮 × 5000组 & 3 / 3 & 通过 \\
|
||||||
FFT功能验证(板级) & 3次 × 2模式 & 6 / 6 & 通过 \\
|
FFT功能验证(板级) & 3次 × 2模式 & 6 / 6 & 通过 \\
|
||||||
|
ML-KEM 系统诊断(板级) & 9组 × 100次迭代 & 9 / 9 & 通过 \\
|
||||||
|
DMA搬运完整性(板级,间接覆盖) & 5000组流水任务 & — & 通过 \\
|
||||||
|
SRAM连续突发读写(板级,间接覆盖) & Matmul、FFT、ML-KEM负载 & — & 通过 \\
|
||||||
|
\midrule
|
||||||
复位释放前事务检查(仿真) & — & — & 无违规 \\
|
复位释放前事务检查(仿真) & — & — & 无违规 \\
|
||||||
DSP资源检查(综合) & — & 0个 / 期望0个 & 通过 \\
|
DSP资源检查(综合后) & — & 0个 / 期望0个 & 通过 \\
|
||||||
|
时序收敛(布局布线后) & 88,843个端点 & — & 零违例 \\
|
||||||
\bottomrule
|
\bottomrule
|
||||||
\end{tabular}
|
\end{tabular}
|
||||||
\end{table}
|
\end{table}
|
||||||
@@ -388,9 +559,11 @@ Vivado静态时序分析报告的完整路径覆盖了88,843个时序端点,
|
|||||||
|
|
||||||
\subsection{存储子系统}
|
\subsection{存储子系统}
|
||||||
|
|
||||||
系统的外部存储子系统由两块板载SRAM芯片构成,每块容量为4 MB,通过统一的SRAM控制器进行访问。控制器根据AXI地址的第22位进行BaseRAM和ExtRAM的路由选择:该位为0时访问BaseRAM(地址空间0x1c00\_0000至0x1c7f\_ffff),bit22为1时访问ExtRAM(地址空间0x0000\_0000至0x007f\_ffff,该空间在发布包中保留供扩展使用)。外部SRAM芯片的最小读写周期为10 ns,因此控制器时钟频率被限制在50 MHz以内,与系统时钟域的50 MHz频率天然匹配。
|
系统的外部存储子系统由两块板载SRAM芯片构成,每块容量为4 MB,通过统一的SRAM控制器进行访问。AXI总线为两块存储器分配连续的8 MB物理窗口,控制器根据AXI地址的第22位进行BaseRAM和ExtRAM的路由选择:bit22为0时访问BaseRAM,对应0x1c00\_0000至0x1c3f\_ffff;bit22为1时访问ExtRAM,对应0x1c40\_0000至0x1c7f\_ffff。两块SRAM内部均使用地址位[21:2]形成20位字地址。外部SRAM芯片的最小读写周期为10 ns,因此控制器时钟频率被限制在50 MHz以内,与系统时钟域的50 MHz频率天然匹配。
|
||||||
|
|
||||||
在竞赛评测场景中,BaseRAM用于存放用户程序的指令和数据,ExtRAM用于存放源矩阵数据和结果矩阵数据。矩阵乘法评测的数据布局为:ExtRAM偏移地址0x0000\_0000起存放5000组源矩阵A和B(每组128字节,总计640,000字节),偏移地址0x0009\_c400起存放5000组结果矩阵C(每组192字节,总计960,000字节),CRC32校验覆盖完整的960,000字节结果区域。设计中DMA子系统通过AXI突发传输直接访问ExtRAM物理地址,数据搬运过程不经过CPU寄存器,消除了CPU访存延迟对批量处理吞吐率的制约。
|
控制器采用第\ref{sec:sram_controller}节所述的连续突发优化。读方向通过地址阶段与数据响应阶段重叠,在当前数据拍被AXI主设备接收的同时准备下一拍SRAM数据;写方向则在\texttt{WVALID/WREADY}持续握手时逐周期推进写地址。由于系统时钟周期为20 ns,每一拍仍为异步SRAM保留了一个完整时钟周期的地址建立和数据稳定窗口。读数据寄存器负责在AXI反压期间保持响应不变,事务级Bank寄存器负责保证BaseRAM与ExtRAM片选在整个突发期间稳定。该实现兼顾了外部器件时序要求和AXI连续传输吞吐率。
|
||||||
|
|
||||||
|
在竞赛评测场景中,BaseRAM用于存放用户程序的指令和数据,ExtRAM用于存放源矩阵数据。标准数据布局在ExtRAM偏移0x0000\_0000处存放5000组源矩阵A和B(每组128字节,总计640,000字节),并为偏移0x0009\_c400处的5000组结果矩阵C保留960,000字节空间。标准写回模式会填充该结果区;当前官方评测使用快速通道模式,跳过结果写回,矩阵核心直接按照与该960,000字节结果序列相同的字节顺序累计CRC32。因此评测校验覆盖的是全部计算结果的逻辑字节序列,而不是快速模式下ExtRAM结果区的实际内容。DMA读取ExtRAM源数据的过程不经过CPU寄存器,消除了CPU访存延迟对批量处理吞吐率的制约。
|
||||||
|
|
||||||
时序收敛的关键设计因素包括三个方面。第一,ML-KEM算法核心中使用了大量的流水线寄存器来切割长组合路径。Keccak-f[1600]的每一轮置换内部已经按照标准结构划分为theta、rho、pi、chi和iota五个子步骤,每个子步骤之间通过寄存器隔离,保证了单轮内的最大逻辑级数可控。Barrett模乘器内部在乘法、常量乘法、比较和减法每一个阶段之间都插入了流水线寄存器。NTT蝶形单元同样在输入读取、蝶形运算和写回控制之间加入了多级流水。第二,跨时钟域路径被声明为异步时钟组,不进行同步时序检查,转而通过双时钟FIFO的结构保证数据可靠传输,避免了对跨域路径进行困难的高频时序约束。第三,综合策略中启用了寄存器重定时和寄存器平衡优化选项,允许工具在保持设计功能不变的前提下重新分布流水线寄存器以平衡各级组合逻辑延迟。
|
时序收敛的关键设计因素包括三个方面。第一,ML-KEM算法核心中使用了大量的流水线寄存器来切割长组合路径。Keccak-f[1600]的每一轮置换内部已经按照标准结构划分为theta、rho、pi、chi和iota五个子步骤,每个子步骤之间通过寄存器隔离,保证了单轮内的最大逻辑级数可控。Barrett模乘器内部在乘法、常量乘法、比较和减法每一个阶段之间都插入了流水线寄存器。NTT蝶形单元同样在输入读取、蝶形运算和写回控制之间加入了多级流水。第二,跨时钟域路径被声明为异步时钟组,不进行同步时序检查,转而通过双时钟FIFO的结构保证数据可靠传输,避免了对跨域路径进行困难的高频时序约束。第三,综合策略中启用了寄存器重定时和寄存器平衡优化选项,允许工具在保持设计功能不变的前提下重新分布流水线寄存器以平衡各级组合逻辑延迟。
|
||||||
|
|
||||||
@@ -417,9 +590,9 @@ Vivado功耗分析报告给出的总片上功耗为\TotalPower{} W,其中动
|
|||||||
|
|
||||||
\subsection{矩阵乘法性能分析}
|
\subsection{矩阵乘法性能分析}
|
||||||
|
|
||||||
矩阵乘法批量评测是本系统竞赛评分的核心项目。系统在三轮官方评测中均通过了CRC32校验,CRC32值完全匹配期望值,结果判定为通过。三轮测试的运行时间分别为6.936 ms、6.944 ms和6.950 ms,中位值为\MatmulBoardMs{} ms,得分为\MatmulScore{}\%。测试覆盖了5000组4x4无符号矩阵乘法,每组包含全零边界用例和随机生成的一般用例。
|
矩阵乘法批量评测是本系统竞赛评分的核心项目。在阶段验证中,系统以三个独立随机种子完成三轮官方评测,运行时间分别为6.936 ms、6.944 ms和6.950 ms,CRC32均完全匹配。随后通过减少软件启动开销、优化批量调度以及进一步压缩SRAM突发数据通路的空闲周期,最终评测在随机种子\MatmulFinalSeed{}下完成5000组4x4无符号矩阵乘法,期望值与上报值均为CRC32 \MatmulFinalCRC{},运行时间为\MatmulFinalMs{} ms,得分为\MatmulFinalScore{}。
|
||||||
|
|
||||||
以中位运行时间\MatmulBoardMs{} ms为准,系统在5000组任务中的平均每组处理延迟约为1.389 us。在系统时钟50 MHz的条件下,每组矩阵乘法平均消耗约69.4个时钟周期。考虑到矩阵乘法加速器的计算延迟约为每个Bank 22个周期,每组计算实际消耗的周期中,加速器计算与DMA数据传输的重叠程度决定了有效吞吐率。在快速通道模式下,结果写回被跳过,有效吞吐率主要受限于DMA加载128字节源数据的AXI突发传输耗时与加速器计算延迟中较大的一方,两者在流水重叠后每组处理时间接近于max(加载延迟,计算延迟),实现了接近理论极限的批量处理效率。
|
以最终运行时间\MatmulFinalMs{} ms为准,系统在5000组任务中的平均每组处理延迟约为0.982353 us。在系统时钟50 MHz的条件下,每组矩阵乘法平均消耗约49.12个时钟周期。每组源数据由一次32拍、32位AXI读突发从ExtRAM装载;SRAM控制器的连续读优化消除了突发内部原有的逐拍空闲周期,并允许相邻读突发在条件满足时直接衔接,从而降低了批量任务中占主导地位的源数据搬运开销。在快速通道模式下,结果写回被跳过,但稳态吞吐率仍由SRAM与CDMA读通道、约22周期的乘加计算以及递归CRC32消费速率共同决定。双Bank流水负责重叠源数据装载与计算,CRC结果FIFO吸收乘加输出和CRC消费之间的短期速率差,因此实测49.12周期每组是完整数据通路协同后的结果,不能仅由单个计算核的22周期延迟推导。相较阶段验证的中位值,最终时间降低约29.27\%,表明本项目的性能收益主要来自启动、搬运、调度、计算和校验全链路的协同优化,而非单独缩短乘加核心延迟。
|
||||||
|
|
||||||
\subsection{FFT性能分析}
|
\subsection{FFT性能分析}
|
||||||
|
|
||||||
@@ -446,7 +619,7 @@ FFT计算结果的数值精度通过比较硬件输出与双精度浮点Radix-2
|
|||||||
|
|
||||||
\subsection{ML-KEM性能分析}
|
\subsection{ML-KEM性能分析}
|
||||||
|
|
||||||
ML-KEM加速器的板级系统诊断测试结果汇总于表\ref{tab:mlkem}。测试在三种安全等级下分别使用软件参考、CPU寄存器加载和DMA批量窗口三种数据传输路径各运行100次迭代,总计900次迭代全部通过,失败次数为零。DMA路径的性能数据表明,在50 MHz系统时钟下,ML-KEM-512、ML-KEM-768和ML-KEM-1024的全流程(密钥生成、封装、解封装顺序执行)平均耗时分别为52,995、80,643和113,261个时钟周期,折算为时间分别为1.605 ms、2.443 ms和3.432 ms。
|
ML-KEM加速器的板级系统诊断测试结果汇总于表\ref{tab:mlkem}。测试在三种安全等级下分别使用软件参考、CPU寄存器加载和DMA批量窗口三种数据传输路径各运行100次迭代,总计900次迭代全部通过,失败次数为零。表中的周期数由OpenLA500的CPU周期计数器采集,计数频率为33 MHz;它们不是50 MHz系统总线周期,也不是76.923 MHz的ML-KEM算法周期。DMA路径中,ML-KEM-512、ML-KEM-768和ML-KEM-1024的全流程(密钥生成、封装、解封装顺序执行)平均耗时分别为52,995、80,643和113,261个CPU周期,按测试程序使用的33 MHz换算后分别为1.605 ms、2.443 ms和3.432 ms。
|
||||||
|
|
||||||
\begin{table}[H]
|
\begin{table}[H]
|
||||||
\centering
|
\centering
|
||||||
@@ -465,7 +638,7 @@ ML-KEM加速器的板级系统诊断测试结果汇总于表\ref{tab:mlkem}。
|
|||||||
|
|
||||||
ML-KEM-1024相对于ML-KEM-512的全流程延迟比值约为2.14倍,这主要源于多项式矩阵维度从2增大至4导致的二次增长效应。在ML-KEM的算法流程中,SampleNTT步骤需要生成k×k的矩阵A中的每个多项式,Computational Number Theory Transform步骤需要对k个私钥多项式和k个误差多项式分别执行正向NTT,Matrix Vector Dot Product步骤需要执行k×k次多项式基乘和k次累积加法。随着k从2增至4,矩阵A的生成量从4个多项式增至16个多项式,NTT执行次数从4次增至8次,基乘次数从4次增至16次,各步骤的工作量增长均呈k²或k的比例关系,这是DMA路径延迟从52,995周期增至113,261周期的根源。
|
ML-KEM-1024相对于ML-KEM-512的全流程延迟比值约为2.14倍,这主要源于多项式矩阵维度从2增大至4导致的二次增长效应。在ML-KEM的算法流程中,SampleNTT步骤需要生成k×k的矩阵A中的每个多项式,Computational Number Theory Transform步骤需要对k个私钥多项式和k个误差多项式分别执行正向NTT,Matrix Vector Dot Product步骤需要执行k×k次多项式基乘和k次累积加法。随着k从2增至4,矩阵A的生成量从4个多项式增至16个多项式,NTT执行次数从4次增至8次,基乘次数从4次增至16次,各步骤的工作量增长均呈k²或k的比例关系,这是DMA路径延迟从52,995周期增至113,261周期的根源。
|
||||||
|
|
||||||
后综合时序仿真提供了各操作的逐状态周期分解,可以更精细地分析各算法步骤对总延迟的贡献。以ML-KEM-512为例,密钥生成操作中G哈希采样的平均耗时仅27.0个周期,A矩阵SampleNTT的平均耗时为3,212.7个周期(占总延迟的23.3\%),CBD采样的平均耗时为1,229.0个周期,NTT变换的平均耗时为4,172.0个周期(占总延迟的30.2\%),多项式基乘的平均耗时为2,096.0个周期,密钥编码的平均耗时为2,081.0个周期。从这些数据可以看出,NTT变换和矩阵采样是密钥生成延迟的主要贡献者,合计占总延迟的53.5\%。封装操作中NTT变换的相关步骤(对y和误差向量执行NTT,以及多项式U和V的基乘步骤)合计占总延迟的39.0\%,压缩步骤合计占8.7\%。解封装操作中,压缩参数解码占25.5\%,重加密流水线(复用封装状态序列)占23.9\%,常量时间密文比较占4.6\%。
|
ML-KEM顶层RTL功能仿真提供了各操作的逐状态周期分解,可以更精细地分析各算法步骤对总延迟的贡献。以ML-KEM-512为例,密钥生成操作中G哈希采样的平均耗时仅27.0个周期,A矩阵SampleNTT的平均耗时为3,212.7个周期(占总延迟的23.3\%),CBD采样的平均耗时为1,229.0个周期,NTT变换的平均耗时为4,172.0个周期(占总延迟的30.2\%),多项式基乘的平均耗时为2,096.0个周期,密钥编码的平均耗时为2,081.0个周期。从这些数据可以看出,NTT变换和矩阵采样是密钥生成延迟的主要贡献者,合计占总延迟的53.5\%。封装操作中NTT变换的相关步骤(对y和误差向量执行NTT,以及多项式U和V的基乘步骤)合计占总延迟的39.0\%,压缩步骤合计占8.7\%。解封装操作中,压缩参数解码占25.5\%,重加密流水线(复用封装状态序列)占23.9\%,常量时间密文比较占4.6\%。
|
||||||
|
|
||||||
\subsection{跨时钟域与系统集成验证}
|
\subsection{跨时钟域与系统集成验证}
|
||||||
|
|
||||||
@@ -509,7 +682,7 @@ ML-KEM的三级安全参数通过相同的硬件数据通路支持,面积开
|
|||||||
% ===========================================================================
|
% ===========================================================================
|
||||||
\section{结论}
|
\section{结论}
|
||||||
|
|
||||||
本文详细阐述了一个基于OpenLA500处理器和Xilinx Artix-7 FPGA平台的异构计算SoC系统的设计、实现与验证全过程。系统成功集成了矩阵乘法加速器、FFT加速器和全参数可配置的ML-KEM后量子密码IP,通过通用DMA子系统和矩阵批量序列器实现了计算加速器的高效协同。系统的功能正确性在四个验证层级上均得到了充分确认:矩阵乘法批量处理以\MatmulBoardMs{} ms的中位运行时间通过了官方评测的CRC32校验,得分为\MatmulScore{}\%;ML-KEM加速器在三种安全等级、三种操作和三种数据传输路径上均以100\%通过率完成了总计900次的系统级诊断测试;FFT加速器在DMA批量模式下实现了827.80倍的软件加速比,计算精度满足预定误差要求。
|
本文详细阐述了一个基于OpenLA500处理器和Xilinx Artix-7 FPGA平台的异构计算SoC系统的设计、实现与验证全过程。系统成功集成了矩阵乘法加速器、FFT加速器和全参数可配置的ML-KEM后量子密码IP,通过通用DMA子系统和矩阵批量序列器实现了计算加速器的高效协同,并通过外部SRAM控制器的连续突发流水化提高了共享存储器的数据供给能力。系统的功能正确性在四个验证层级上均得到了充分确认:矩阵乘法批量处理以\MatmulFinalMs{} ms完成5000组官方评测,CRC32与期望值一致并获得\MatmulFinalScore{};ML-KEM加速器在三种安全等级、三种操作和三种数据传输路径上均以100\%通过率完成了总计900次的系统级诊断测试;FFT加速器在DMA批量模式下实现了827.80倍的软件加速比,计算精度满足预定误差要求。上述板级测试同时对优化后SRAM控制器的BaseRAM取指、ExtRAM长突发访问和Bank选择形成了系统级覆盖。
|
||||||
|
|
||||||
系统的FPGA物理实现在xc7a200tfbg676-1器件上完整通过布局布线,资源利用率为LUT 41.16\%、寄存器11.58\%、块存储器8.08\%、DSP 0\%。三个异步时钟域在76.923 MHz、50 MHz和33.333 MHz的目标频率下均建立保持时间收敛,最差负裕量为0.070 ns,零时序违例。总片上功耗为0.779 W,其中ML-KEM加速器为主要动态功耗来源。系统代码通过了HDL静态检查,综合后DSP资源为零的约束得到满足,跨时钟域报告中的警告项经过分析后确认不构成功能风险。
|
系统的FPGA物理实现在xc7a200tfbg676-1器件上完整通过布局布线,资源利用率为LUT 41.16\%、寄存器11.58\%、块存储器8.08\%、DSP 0\%。三个异步时钟域在76.923 MHz、50 MHz和33.333 MHz的目标频率下均建立保持时间收敛,最差负裕量为0.070 ns,零时序违例。总片上功耗为0.779 W,其中ML-KEM加速器为主要动态功耗来源。系统代码通过了HDL静态检查,综合后DSP资源为零的约束得到满足,跨时钟域报告中的警告项经过分析后确认不构成功能风险。
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user