feat(L04): add RV32I decoder and register file card

This commit is contained in:
user
2026-07-21 16:54:03 +02:00
commit ecd7adc0ae
42 changed files with 7255 additions and 0 deletions
+29
View File
@@ -0,0 +1,29 @@
{
"$schema": "../../../../tools/card-layouts/schemas/card-source.schema.json",
"schema": "esc-card-source.v1",
"card": {"id": "mpabi-inf-rv32i-asm-04-decoder", "series": "rv32i-asm", "series_title": "ASM · RV32I From Blinker to RISC-V", "number": "04", "count": "09", "slug": "decoder", "title": "L04 · The RISC-V ISA and Instruction Decoder", "topic": "Pola instrukcji, klasy opcode i bank rejestrów", "project": "Front-end minimalnego rdzenia RV32I", "subject": "Informatyka", "level": "Rok 1 · RTL · RV32I", "revision_date": "2026-07-21T00:00:00+02:00", "status": "Gotowa do symulacji", "version": "v00.01", "uuid": "f95c41db-8abd-5623-b40d-743cc19eb469", "author": "M. Pabiszczak", "year": "2026"},
"generated": {"tex": "doc/generated/main.tex", "html": "web/index.html", "html_css": "web/style.css", "react_app": true, "html_tree_inspector": false},
"template": "templates/karta-klasyczna.json",
"title_block": {"category": "KARTA PRACY · INFORMATYKA · RTL", "standard": "ISO 7200", "prepared_by": "M. Pabiszczak", "prepared_on": "21.07.2026", "checked_by": "testy automatyczne", "approved_by": "—", "url": "http://localhost:8080", "repository_url": "https://gitea.local/edu-inf/lab-rv32i-asm-decoder", "revision": "1", "issued_on": "21.07.2026", "series": "RV32I-ASM-04", "document_type": "karta pracy", "tool": "card-layouts", "sheet": "1 / 1", "show_qr": false, "show_repository_qr": false, "height_cm": 3, "repeat_on_every_page": true, "replace_front_matter": true},
"front_page_scope": {"title": "Cel karty", "content_tex": "Uczeń rozkłada instrukcję RV32I na pola, klasyfikuje opcode bez stanów niejawnych i dowodzi inwariantu rejestru x0.", "scope_title": "Zakres tasków", "scope_table": {"headers": ["Krok", "Numer tasku", "Najważniejsza idea", "Priorytet", "Status", "Version"], "rows": [{"chapter": "4", "task": "Task01", "idea_tex": "pola i sign extension", "priority": "obowiązkowe", "status": "ready", "version": "v00.01"}, {"chapter": "4", "task": "Task02", "idea_tex": "klasy opcode i illegal", "priority": "obowiązkowe", "status": "ready", "version": "v00.01"}, {"chapter": "5", "task": "Task03", "idea_tex": "bank rejestrów i x0", "priority": "obowiązkowe", "status": "ready", "version": "v00.01"}]}},
"side_margin_tree_layout": {"columns": [{"id": "zawodowe", "label": "TECH", "side": "left", "tree": "WE -> EK -> KW", "description": "Implementacja front-endu RV32I."}, {"id": "ogolne", "label": "OG", "side": "right", "tree": "WE -> EN -> KW", "description": "Kodowanie, pomiar i uzasadnienie."}]},
"learning_effects": {"RV04.EN01": {"bloom_level": "Analiza", "label": "Kodowanie", "text": "Uczeń interpretuje pola i liczby ze znakiem w instrukcji RV32I.", "assessment_criteria": ["RV04.KW01"]}, "RV04.EK01": {"bloom_level": "Tworzenie", "label": "Dekoder", "text": "Uczeń implementuje deterministyczny dekoder i bank rejestrów.", "assessment_criteria": ["RV04.KW01"]}},
"assessment_criteria": {"RV04.KW01": {"text": "Model i RTL zwracają zgodne pola, siedem legalnych kodów, illegal dla 0x7f oraz niezmienne x0.", "learning_effects": ["RV04.EN01", "RV04.EK01"]}},
"educational_requirements": {"RV04.WE01": {"text": "Zaprojektowanie weryfikowalnego front-endu RV32I.", "label": "Dekodowanie RV32I", "learning_effects": ["RV04.EN01", "RV04.EK01"], "learning_tree": {"schema": "we-learning-tree.v1", "policy": "Każde kodowanie ma jawny wynik legalny albo illegal.", "ogolne": [{"effect_ref": "RV04.EN01", "display": "EN IP WO RV04.01", "source": "IP", "official": "RV04.01", "local": "01", "text": "Uczeń analizuje kodowanie instrukcji.", "kind": "WO", "tree_id": "RV04.WE01.OG.IP.01", "kw": [{"criterion_ref": "RV04.KW01", "display": "KW IP WS RV04.01", "source": "IP", "kind": "WS", "official": "RV04.01", "local": "01", "text": "Pola i immediate są zgodne z kodowaniem."}]}], "zawodowe": [{"effect_ref": "RV04.EK01", "display": "EK INF04 RV04.01", "source": "I4", "official": "RV04.01", "local": "01", "text": "Uczeń tworzy dekoder i bank rejestrów.", "kind": "EK", "tree_id": "RV04.WE01.TECH.I4.01", "kw": [{"criterion_ref": "RV04.KW01", "display": "KW INF04 RV04.01", "source": "I4", "kind": "KW", "official": "RV04.01", "local": "01", "text": "Testbenche kończą się PASS i zapisują VCD."}]}]}}},
"sections": [
{"title": "Task01 · Pola instrukcji", "order": 10, "content_kind": "prose", "content_tex": "Rozłóż słowo \\texttt{0xFFC30293}. Pole immediate ma 12 bitów i jest rozszerzane znakiem z \\texttt{instr[31]}, dlatego wynik wynosi -4.", "educational_requirement_refs": ["RV04.WE01"], "learning_effect_refs": ["RV04.EN01", "RV04.EK01"], "assessment_criterion_refs": ["RV04.KW01"], "area_tree_refs": ["RV04.WE01.OG.IP.01", "RV04.WE01.TECH.I4.01"], "steps": [{"id": "T01-PREDICT", "title": "Zapisz pola przed uruchomieniem testu.", "tree_refs": ["RV04.WE01.OG.IP.01"], "educational_requirement_refs": ["RV04.WE01"], "learning_effect_refs": ["RV04.EN01"], "assessment_criterion_refs": ["RV04.KW01"]}, {"id": "T01-MEASURE", "title": "Porównaj model, RTL i VCD.", "tree_refs": ["RV04.WE01.TECH.I4.01"], "educational_requirement_refs": ["RV04.WE01"], "learning_effect_refs": ["RV04.EK01"], "assessment_criterion_refs": ["RV04.KW01"]}], "assets": [{"path": "assets/decoder-path.png", "html_path": "assets/decoder-path.svg", "caption": "Instrukcja przechodzi przez ekstrakcję pól i dekoder do banku rejestrów.", "label": "fig:decoder-path", "alt": "Diagram instrukcja, dekoder i bank rejestrów.", "kind": "diagram", "width": 0.9}]},
{"title": "Task02 · Klasy opcode", "order": 20, "content_kind": "prose", "content_tex": "Wyjścia klas są one-hot z wyjątkiem dwóch kodów skoku współdzielących sygnał jump. Domyślna gałąź ustawia illegal i nie włącza żadnej operacji.", "educational_requirement_refs": ["RV04.WE01"], "learning_effect_refs": ["RV04.EN01", "RV04.EK01"], "assessment_criterion_refs": ["RV04.KW01"], "area_tree_refs": ["RV04.WE01.OG.IP.01", "RV04.WE01.TECH.I4.01"], "steps": [{"id": "T02-ILLEGAL", "title": "Sprawdź siedem legalnych kodów i bezpieczny default.", "tree_refs": ["RV04.WE01.OG.IP.01", "RV04.WE01.TECH.I4.01"], "educational_requirement_refs": ["RV04.WE01"], "learning_effect_refs": ["RV04.EN01", "RV04.EK01"], "assessment_criterion_refs": ["RV04.KW01"]}]},
{"title": "Task03 · Bank rejestrów", "order": 30, "content_kind": "prose", "content_tex": "Dwa odczyty są kombinacyjne, zapis następuje na zboczu zegara. Adres zero omija tablicę stanu, więc x0 nie może zostać zmieniony.", "educational_requirement_refs": ["RV04.WE01"], "learning_effect_refs": ["RV04.EN01", "RV04.EK01"], "assessment_criterion_refs": ["RV04.KW01"], "area_tree_refs": ["RV04.WE01.OG.IP.01", "RV04.WE01.TECH.I4.01"], "steps": [{"id": "T03-X0", "title": "Zapisz x5, spróbuj zapisać x0 i zmierz oba porty.", "tree_refs": ["RV04.WE01.OG.IP.01", "RV04.WE01.TECH.I4.01"], "educational_requirement_refs": ["RV04.WE01"], "learning_effect_refs": ["RV04.EN01", "RV04.EK01"], "assessment_criterion_refs": ["RV04.KW01"]}]}
],
"tasks": {"task01": {"prompt_tex": "Zdekoduj ADDI x5,x6,-4.", "criterion": "opcode=13 rd=5 rs1=6 funct3=0 imm=-4", "educational_requirement_refs": ["RV04.WE01"], "learning_effect_refs": ["RV04.EN01", "RV04.EK01"], "assessment_criterion_ref": "RV04.KW01", "links": {"equations": [], "figures": ["fig:decoder-path"]}}, "task02": {"prompt_tex": "Skategoryzuj legalne opcode i odrzuć 0x7f.", "criterion": "legal=7 jump=6f,67 illegal_7f=1", "educational_requirement_refs": ["RV04.WE01"], "learning_effect_refs": ["RV04.EN01", "RV04.EK01"], "assessment_criterion_ref": "RV04.KW01", "links": {"equations": [], "figures": ["fig:decoder-path"]}}, "task03": {"prompt_tex": "Zweryfikuj zapis x5, dwa odczyty i niezmienne x0.", "criterion": "x5=12345678 x0=00000000 dual_read=1", "educational_requirement_refs": ["RV04.WE01"], "learning_effect_refs": ["RV04.EN01", "RV04.EK01"], "assessment_criterion_ref": "RV04.KW01", "links": {"equations": [], "figures": ["fig:decoder-path"]}}},
"tasks_order": ["task01", "task02", "task03"],
"mission": "Zamień słowo instrukcji w bezpieczne sygnały sterowania i operandy banku rejestrów.",
"objectives": ["Odczytasz pola instrukcji RV32I.", "Zaprojektujesz bezpieczny dekoder opcode.", "Udowodnisz inwariant x0."],
"agenda": [{"time": "0--20 min", "work": "Kodowanie i Task01."}, {"time": "20--40 min", "work": "Klasy opcode i illegal."}, {"time": "40--65 min", "work": "Bank rejestrów, VCD i evidence."}],
"tech_stack": {"software": [{"name": "SystemVerilog", "use": "front-end RV32I"}, {"name": "Verilator", "use": "self-checking testbench i VCD"}, {"name": "stemctl", "use": "uruchamianie profili"}], "hardware": [{"name": "Brak wymaganego FPGA", "use": "karta jest deterministyczna w symulacji RTL"}]},
"theory_refs": {"intro": "RV32I używa stałych pozycji opcode, rd, funct3, rs1 i rs2; format instrukcji określa sposób złożenia immediate.", "known_refs": [], "new_concepts": [{"term": "opcode", "definition": "Siedmiobitowa główna klasa instrukcji."}, {"term": "sign extension", "definition": "Powielenie bitu znaku do starszych bitów wyniku."}, {"term": "x0", "definition": "Rejestr architektoniczny, którego odczyt zawsze daje zero."}]},
"container_test": {"title": "Test bez płytki", "commands": ["stemctl test native-amd64 rv32i-asm L04 1", "stemctl test hazard3-sim rv32i-asm L04 2", "stemctl debug hazard3-sim rv32i-asm L04 3"], "pass_condition": "Trzy modele i trzy testbenche zwracają PASS; debug zapisuje VCD."},
"safety_rules": [{"title": "Bezpieczny default", "body": "Nieznany opcode ustawia illegal i zeruje wszystkie sygnały operacji."}, {"title": "x0 bez stanu", "body": "Nie przechowuj zapisu pod adresem zero."}],
"hardware_procedure": [{"step": "1", "action": "Uruchom model referencyjny.", "condition": "Oczekiwane pola są zapisane przed RTL."}, {"step": "2", "action": "Uruchom self-checking testbench.", "condition": "Wynik PASS bez $fatal."}, {"step": "3", "action": "Zapisz VCD banku rejestrów.", "condition": "Widoczny zapis x5 i ignorowany zapis x0."}],
"references": []
}