Skip to content

kxrxh/CA-Experiment

Repository files navigation

Π­ΠΊΡΠΏΠ΅Ρ€ΠΈΠΌΠ΅Π½Ρ‚Π°Π»ΡŒΠ½Π°Ρ модСль процСссора ΠΈ транслятора

ΠŸΠ°Ρ€Ρ…ΠΎΠΌΠ΅Π½ΠΊΠΎ ΠšΠΈΡ€ΠΈΠ»Π» АлСксандрович P3212

Π’Π°Ρ€ΠΈΠ°Π½Ρ‚ (Π‘Π°Π·ΠΎΠ²Ρ‹ΠΉ)

asm | risc | harv | mc | instr | binary | stream | mem | cstr | prob2

ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅:

Π₯отя Π² Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Π΅ ΡƒΠΊΠ°Π·Π°Π½Π° Ρ‚ΠΎΡ‡Π½ΠΎΡΡ‚ΡŒ модСлирования instr, Π±Ρ‹Π»Π° Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Π° tick, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Π° Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π² сСбя ΠΌΠΈΠΊΡ€ΠΎΠΊΠΎΠΌΠ°Π½Π΄Ρ‹

Π―Π·Ρ‹ΠΊ программирования

Бинтаксис

По Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Ρƒ Π½ΡƒΠΆΠ½ΠΎ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ ассСмблСр для Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Ρ‹ RISC

<program> ::= { <section> }

<section> ::= "." "text" { <instruction> }
            | "." "data" { <data_definition> }

<instruction> ::=
               | "halt"
               | "nop"
               | "jmp" <label>
               | "beq" <register> "," <register> "," <label>
               | "bne" <register> "," <register> "," <label>
               | "bgt" <register> "," <register> "," <label>
               | "blt" <register> "," <register> "," <label>
               | "add" <register> "," <register> "," { <label> | <number> | <register> }
               | "sub" <register> "," <register> "," { <label> | <number> | <register> }
               | "and" <register> "," <register> "," { <label> | <number> | <register> }
               | "mul" <register> "," <register> "," { <label> | <number> | <register> }
               | "lw" <register> "," <register>
               | "sw" <register> "," <register>
               | <label> ":"


<data_definition> ::= <identifier> ":" <data_value>
                    | <comment>

<data_value> ::= <string>
               | <number>
               | <comment>

 <register> ::= "r" <number>

 <operand> ::= <register>
            | "#" <number>
            | <identifier>

 <label> ::= "." <identifier>

<identifier> ::= <letter> { <letter> | <digit> }
               | <identifier> "." <identifier>

<number> ::= <digit> { <digit> }

<string> ::= "\"" { <character> } "\""

<letter> ::= "a" | "b" | "c" | ... | "z"
           | "A" | "B" | "C" | ... | "Z"

<digit> ::= "0" | "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9"

<character> ::= <any printable ASCII character except quotation mark>

<comment> ::= "//" { <any printable ASCII character> }

ΠšΠΎΠΌΠ°Π½Π΄Ρ‹

  • lw a, b - Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠ° ΠΈΠ· памяти значСния ΠΏΠΎ адрСса Π² рСгистрС b Π² рСгистр a.
  • sw a, b - сохранСниС Π² ΠΏΠ°ΠΌΡΡ‚ΡŒ содСрТимого рСгистра a ΠΏΠΎ адрСсу Π² рСгистрС b.
  • add a, b, c - слоТСниС содСрТимого рСгистров b, с, ΠΈ запись Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π° Π² рСгистр a.
  • sub a, b, c - Π²Ρ‹Ρ‡ΠΈΡ‚Π°Π½ΠΈΠ΅ ΠΈΠ· рСгистра b рСгистра с, ΠΈ запись Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π° Π² рСгистр a.
  • and a, b, c - логичСскоС И содСрТимого рСгистров b, с, ΠΈ запись Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π° Π² рСгистр a.
  • mul a b c - ΠΏΠ΅Ρ€Π΅ΠΌΠ½ΠΎΠΆΠ΅Π½ΠΈΠ΅ содСрТимого рСгистров b, с, ΠΈ запись Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π° Π² рСгистр a.
  • beq a b c - сравнСниС содСрТимого рСгистров a, b ΠΈ ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ ΠΏΠΎ адрСсу ΠΌΠ΅Ρ‚ΠΊΠΈ c, Ссли значСния рСгистров Ρ€Π°Π²Π½Ρ‹
  • bne a b c - сравнСниС содСрТимого рСгистров a, b ΠΈ ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ ΠΏΠΎ адрСсу ΠΌΠ΅Ρ‚ΠΊΠΈ c, Ссли значСния рСгистров Π½Π΅ Ρ€Π°Π²Π½Ρ‹
  • blt a b c - сравнСниС содСрТимого рСгистров a, b ΠΈ ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ ΠΏΠΎ адрСсу ΠΌΠ΅Ρ‚ΠΊΠΈ c, Ссли a < b
  • bgt a b c - сравнСниС содСрТимого рСгистров a, b ΠΈ ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ ΠΏΠΎ адрСсу ΠΌΠ΅Ρ‚ΠΊΠΈ c, Ссли a > b
  • jmp a - ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ ΠΏΠΎ адрСсу ΠΌΠ΅Ρ‚ΠΊΠΈ a

ΠžΡ€Π³Π°Π½ΠΈΠ·Π°Ρ†ΠΈΡ памяти

  • МодСль памяти соотвСствуСт Гарвардской Π°Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Π΅
  • Π—Π° ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ рСгистрами ΠΎΡ‚Π²Π΅Ρ‡Π°Π΅Ρ‚ Register File
  • ΠžΠ±Ρ€Π°Ρ‰Π΅Π½ΠΈΠ΅ ΠΊ памяти происходит Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‡Π΅Ρ€Π΅Π· рСгистры (Π»Π΅Π²Ρ‹ΠΉ Π²Ρ‹Ρ…ΠΎΠ΄ ΠΈΠ· Register file - это адрСс, Π° ΠΏΡ€Π°Π²Ρ‹ΠΉ - Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ (для записи))
  • Π˜Π½ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΠΈ ΠΈΠΌΠ΅ΡŽΡ‚ Ρ„ΠΈΠΊΡΠΈΡ€ΠΎΠ²Π°Π½Π½ΡƒΡŽ Π΄Π»ΠΈΠ½Ρƒ - 32 Π±ΠΈΡ‚Π°
  • МодСль Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ 16 основных рСгистров
  • ALU Π½Π΅ ΠΈΠΌΠ΅Π΅Ρ‚ прямого доступа ΠΊ памяти
  • РСгистр 0 - Zero register (Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ всСгда Ρ€Π°Π²Π½ΠΎ 0)
  • РСгистр 15 - Π²Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΉ рСгистр (ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для хранСния Π²Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ…)
  • АдрСса ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‚ ΠΈΠ· сСбя Π±Π΅Π·Π·Π½Π°ΠΊΠΎΠ²Ρ‹Π΅ 16 Π±ΠΈΡ‚Π½Ρ‹Π΅ числа
  • ΠžΠ±Ρ€Π°Ρ‰Π΅Π½ΠΈΠ΅ ΠΊ памяти ΠΏΡ€ΠΎΠΈΡΡ…ΠΎΠ΄ΠΈΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΠΎ Π°Π±ΡΠΎΠ»ΡŽΡ‚Π½ΠΎΠΌΡƒ адрСсу
  • ΠŸΡ€ΠΈΡΡƒΡ‚ΡΡ‚Π²ΡƒΠ΅Ρ‚ 3 Π²ΠΈΠ΄Π° памяти: ΠŸΠ°ΠΌΡΡ‚ΡŒ инструкций, ΠŸΠ°ΠΌΡΡ‚ΡŒ Π΄Π°Π½Π½Ρ‹Ρ…, ΠŸΠ°ΠΌΡΡ‚ΡŒ ΠΌΠΈΠΊΡ€ΠΎΠΊΠΎΠΌΠ°Π½Π΄
  • Π Π°Π·ΠΌΠ΅Ρ€ машиного слова - 32 Π±ΠΈΡ‚Π°
       Instruction memory
+-----------------------------+
| 00       binary instr       |
| 01       binary instr       |
|      ...                    |
+-----------------------------+


        Data Memory
+-----------------------------+    +-------+
| 00       value              | <--|IN_BUF |
| 01       value              | <--|OUT_BUF|
|      ...                    |    +-------+
| 10       value              |
| 11       value              |
|      ...                    |
+-----------------------------+

       Microprogram memory
+------------------------------+
| 00       Signals             |
| 01       Signals             |
|      ...                     |
+------------------------------+

Π‘ΠΈΠ½Π°Ρ€Π½ΠΎΠ΅ прСдставлСниС инструкций (32 bit)

Opcode RB R1 Address/Number Flag Operation
7 bits 4 bits 4 bits 16 bits 1 bit = 32 bit
Opcode RB R1 16 * [0] 1 Write word operation
Opcode RB R1 16 * [0] 0 Load word operation
Opcode RB R1 R2 0 Math operations (reg-reg)
Opcode RB R1 Number 1 Math operations (reg-imm)
Opcode RB R1 Address 0 Branch operations
Opcode 0000 0000 Address 1 Branch (Jump) operation
Opcode 0000 0000 16 * [0] 0 HALT/NOP operation

БистСма ΠΊΠΎΠΌΠ°Π½Π΄

Цикл исполнСния

  1. Instruction fetch (3 Ρ‚Π°ΠΊΡ‚Π°)
  2. Insruction excution (N Ρ‚Π°ΠΊΡ‚ΠΎΠ²)

Набор инструкций

Π˜Π½ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΡ Кол-Π²ΠΎ Ρ‚Π°ΠΊΡ‚ΠΎΠ² ОписаниС
add 1-2 rb[0] = r[1] + r[2] Π˜Π›Π˜ OP[2] -> r15, rb[0] = r1[1] + r15
mul 1-2 rb[0] = r[1] * r[2] Π˜Π›Π˜ OP[2] -> r15, rb[0] = r1[1] * r15
and 1-2 rb[0] = r[1] & r[2] Π˜Π›Π˜ OP[2] -> r15, rb[0] = r1[1] & r15
sub 1-2 rb[0] = r[1] - r[2] Π˜Π›Π˜ OP[2] -> r15, rb[0] = r1[1] - r15
halt 1 ΠžΡΡ‚Π°Π½ΠΎΠ²ΠΊΠ° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹
nop 1 No operation
jmp [addr] 1 PC = OP[2]
beq [addr] 2 r[0] - r[1] -> NZ, IF Z -> PC = OP[2]
bne [addr] 2 r[0] - r[1] -> NZ, IF Z -> PC++
blt 2 r[0] - r[1] -> NZ, IF N -> PC = OP[2]
bgt 2 r[0] - r[1] -> NZ, IF N -> PC++
lw 2 DATA_LINE = MEM[r[1]], rb[0] = DATA_LINE
sw 1 MEM[RF[LEFT]] = RF[RIGHT]

* rb[N] - рСгистр для записи Π²Ρ‹Π±Ρ€Π°Π½Π½Ρ‹ΠΉ Π½Π° основС значСния ΠΎΠΏΠ΅Ρ€Π°Π½Π΄Π° инструкции * r[N] - рСгистр для чтСния Π²Ρ‹Π±Ρ€Π°Π½Π½Ρ‹ΠΉ Π½Π° основС значСния ΠΎΠΏΠ΅Ρ€Π°Π½Π΄Π° инструкции * OP[2] - прямая Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠ° Π΄Π°Π½Π½Ρ‹Ρ… ΠΈΠ· Π΄Π΅ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠΉ инструкции * RF[LEFT | RIGHT] - ΠΏΡ€Π°Π²Ρ‹ΠΉ Π»Π΅Π²Ρ‹ΠΉ Π²Ρ‹Ρ…ΠΎΠ΄ Register File * DATA_LINE - шина Π΄Π°Π½Π½Ρ‹Ρ…, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ приходят значСния ΠΈΠ· Control Unit, ALU ΠΈ Data Memory

ΠœΠΈΠΊΡ€ΠΎΠΊΠΎΠΌΠ°Π½Π΄Ρ‹

  • HALT (сигнал прСкращСния Ρ€Π°Π±ΠΎΡ‚Ρ‹)
  • LATCH_REG (Π·Π°Ρ‰Π΅Π»ΠΊΠΈΠ²Π°Π½ΠΈΠ΅ рСгистра Π½Π° основС значСния ΠΎΠΏΠ΅Ρ€Π°Π½Π΄Π° RD)
  • LATCH_REG0 (сигнал Π·Π°Ρ‰Π΅Π»ΠΊΠΈΠ²Π°Π½ΠΈΠ΅ рСгистра r0)
  • LATCH_REG1 (сигнал Π·Π°Ρ‰Π΅Π»ΠΊΠΈΠ²Π°Π½ΠΈΠ΅ рСгистра r1)

...

  • LATCH_REG14 (сигнал Π·Π°Ρ‰Π΅Π»ΠΊΠΈΠ²Π°Π½ΠΈΠ΅ рСгистра r14)

  • LATCH_REG15 (сигнал Π·Π°Ρ‰Π΅Π»ΠΊΠΈΠ²Π°Π½ΠΈΠ΅ рСгистра r15)

  • ALU_ADD (сигнал для слоТСния Π² ALU)

  • ALU_SUB (сигнал для вычСтания Π² ALU)

  • ALU_AND (сигнал для логичСского И Π² ALU)

  • ALU_MUL(сигнал для умноТСния Π² ALU)

  • LATCH_PC (сигнал для защСлкивания значСния PC)

  • LATCH_MPC (сигнал для защСлкивания значСния MCP)

  • LATCH_IR (сигнал для защСлкивания значСния IR)

  • LATCH_OPERANDS (сигнал для защСлкивания рСгистра с ΠΎΠΏΠ΅Ρ€Π°Π½Π΄Π°ΠΌΠΈ)

  • LATCH_READ_MEM (сигнал для Π²Ρ‹Π²ΠΎΠ΄Π° (защСлкивания) значСния ячСйки памяти Π½Π° ΡˆΠΈΡˆΡƒ Π΄Π°Π½Π½Ρ‹Ρ…)

  • LATCH_WRITE_MEM (сигнал для записи значСния Π² ячСйку памяти)

  • SEL_PC_ADDR (ΡƒΠΏΡ€Π°Π²Π»ΡΡŽΡ‰ΠΈΠΉ сигнал для Π²Ρ‹Π±ΠΎΡ€ ΡˆΠΈΠ½Ρ‹ с адрСсом для PC)

  • SEL_PC_INC (ΡƒΠΏΡ€Π°Π²Π»ΡΡŽΡ‰ΠΈΠΉ сигнал для ΠΈΠ½ΠΊΡ€ΠΌΠ΅Π½Ρ‚Π° (+1) значСния PC)

  • SEL_MPC_ZERO (ΡƒΠΏΡ€Π°Π²Π»ΡΡŽΡ‰ΠΈΠΉ сигнал для установки значСния 0 Π² MPC)

  • SEL_MPC_INC (ΡƒΠΏΡ€Π°Π²Π»ΡΡŽΡ‰ΠΈΠΉ сигнал для ΠΈΠ½ΠΊΡ€Π΅ΠΌΠ΅Π½Ρ‚Π° значСния MPC (+1 ΠΈΠ»ΠΈ +2))

  • SEL_MPC_IR (ΡƒΠΏΡ€Π°Π²Π»ΡΡŽΡ‰ΠΈΠΉ сигнал для присваивания значСния MPC ΠΈΠ· IR)

  • SEL_TWICE_INC_IF_Z (ΡƒΠΏΡ€Π°Π²Π»ΡΡŽΡ‰ΠΈΠΉ сигнал, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ устанавливаСт шаг ΠΈΠ½ΠΊΡ€Π΅ΠΌΠ΅Π½Ρ‚Π° MPC Π² +2, Ссли сигнал Z = 1)

  • SEL_TWICE_INC_IF_N (ΡƒΠΏΡ€Π°Π²Π»ΡΡŽΡ‰ΠΈΠΉ сигнал, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ устанавливаСт шаг ΠΈΠ½ΠΊΡ€Π΅ΠΌΠ΅Π½Ρ‚Π° MPC Π² +2, Ссли сигнал N = 1)

  • SEL_ONE_INC (ΡƒΠΏΡ€Π°Π²Π»ΡΡŽΡ‰ΠΈΠΉ сигнал для установки шага ΠΈΠ½ΠΊΡ€Π΅ΠΌΠ΅Π½Ρ‚Π° MPC Π² +1)

  • SEL_SRC_MEM (ΡƒΠΏΡ€Π°Π²Π»ΡΡŽΡ‰ΠΈΠΉ сигнал, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Register File ΠΏΡ€ΠΈΡ…ΠΎΠ΄ΠΈΠ»ΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΈΠ· памяти Π΄Π°Π½Π½Ρ‹Ρ…)

  • SEL_SRC_ALU (ΡƒΠΏΡ€Π°Π²Π»ΡΡŽΡ‰ΠΈΠΉ сигнал, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Register File ΠΏΡ€ΠΈΡ…ΠΎΠ΄ΠΈΠ»ΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΈΠ· ALU)

  • SEL_SRC_CU (ΡƒΠΏΡ€Π°Π²Π»ΡΡŽΡ‰ΠΈΠΉ сигнал, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Register File ΠΏΡ€ΠΈΡ…ΠΎΠ΄ΠΈΠ»ΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΈΠ· Control Unit (прямая Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠ° ΠΎΠΏΠ΅Ρ€Π°Π½Π΄Π°))

  • SEL_REG_L (Π²Ρ‹Π±ΠΎΡ€ рСгистра Π½Π° Π»Π΅Π²Ρ‹ΠΉ Π²Ρ‹Ρ…ΠΎΠ΄ Register File Π½Π° основС значСния ΠΎΠΏΠ΅Ρ€Π°Π½Π΄Π° r1)

  • SEL_REG_R (Π²Ρ‹Π±ΠΎΡ€ рСгистра Π½Π° Π»Π΅Π²Ρ‹ΠΉ Π²Ρ‹Ρ…ΠΎΠ΄ Register File Π½Π° основС значСния ΠΎΠΏΠ΅Ρ€Π°Π½Π΄Π° r2)

ВсС сигналы Π² microcode.py

Вранслятор

Π˜Π½Ρ‚Π΅Ρ€Ρ„Π΅ΠΉΡ ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строки: translator.py <input_file> <target_code_file> <target_data_file> Π Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½ΠΎ Π² ΠΌΠΎΠ΄ΡƒΠ»Π΅: translator.py

Он выполняСт нСсколько ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹Ρ… шагов:

  • Π£Π΄Π°Π»Π΅Π½ΠΈΠ΅ ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠ΅Π²: Ѐункция remove_comments удаляСт ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΈ, Ρ‡Ρ‚ΠΎ ΡƒΠΏΡ€ΠΎΡ‰Π°Π΅Ρ‚ Π΄Π°Π»ΡŒΠ½Π΅ΠΉΡˆΡƒΡŽ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΡƒ.

  • ΠŸΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ всСго исходного ΠΊΠΎΠ΄Π° Π² Ρ‚ΠΎΠΊΠ΅Π½Ρ‹: Ѐункция tokenize ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΡƒΠ΅Ρ‚ строки Π² массивы Ρ‚ΠΎΠΊΠ΅Π½ΠΎΠ² с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ рСгулярных Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ.

  • ΠŸΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ массивов Ρ‚ΠΎΠΊΠ΅Π½ΠΎΠ² Π² Π΄Π²ΠΎΠΈΡ‡Π½ΠΎΠ΅ прСдставлСниС фиксированной Π΄Π»ΠΈΠ½Π½Ρ‹: Ѐункция convert_tokens_to_binary ΠΊΠΎΠ½Π²Π΅Ρ€Ρ‚ΠΈΡ€ΡƒΠ΅Ρ‚ инструкции, Π° функция convert_data_tokens_to_binary - Π΄Π°Π½Π½Ρ‹Π΅

  • Запуск трансляции: Основная функция main считываСт исходный Ρ„Π°ΠΉΠ», выполняСт ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄ ΠΈ записываСт Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ Π² Ρ†Π΅Π»Π΅Π²Ρ‹Π΅ Ρ„Π°ΠΉΠ»Ρ‹.

БистСма Π²Π²ΠΎΠ΄Π°-Π²Ρ‹Π²ΠΎΠ΄Π°

  • Π Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½ mem-mapped IO
  • Π’Π²ΠΎΠ΄-Π²Ρ‹Π²ΠΎΠ΄ производится ΠΏΡƒΡ‚Π΅ΠΌ обращСния ΠΊ ячСйкам 0 ΠΈ 1 Data Memory
  • ΠŸΡ€ΠΈ ΠΎΠ±Ρ€Π°Ρ‰Π΅Π½ΠΈΠ΅ ΠΊ ячСйкам 0 ΠΈ 1 происходит считываниС ΠΈ запись Π² Π±ΡƒΡ„Ρ„Π΅Ρ€ соотвСствСнно
  • Для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с Π²Π²ΠΎΠ΄ΠΎΠΌ-Π²Ρ‹Π²ΠΎΠ΄ΠΎΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ Ρ‚Π΅ ΠΆΠ΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹, Ρ‡Ρ‚ΠΎ ΠΈ для ΠΎΠ±Ρ‹Ρ‡Π½ΠΎΠΉ Ρ€Π°Π±ΠΎΡ‚Ρ‹ с ΠΏΠ°ΠΌΡΡ‚ΡŒΡŽ: lw, sw
  • Если Π² in Π±ΡƒΡ„Π΅Ρ€Π΅ ΠΊΠΎΠ½Ρ‡Π°ΡŽΡ‚ΡΡ элСмСнты - процСссор ΠΏΡ€Π΅ΠΊΡ€Π°Ρ‰Π°Π΅Ρ‚ Ρ€Π°Π±ΠΎΡ‚Ρƒ

МодСль процСссора

Π’ΡΡŽ схСму Ρ†Π΅Π»Π΅ΠΊΠΎΠΌ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ здСсь

DataPath

datapath

РСализован в классС DataPath

ΠžΡΠ½ΠΎΠ²Π½Ρ‹Π΅ элСмСнты:

  • ALU
  • Register File
  • Data Memory
  • Instruction Memory
  • IO Controller

Π‘ΠΈΠ³Π½Π°Π»Ρ‹:

  • latch_register - Π·Π°Ρ‰Π΅Π»ΠΊΠΈΠ²Π°Π½ΠΈΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ N рСгистра
  • operation - сигнал ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ ALU
  • latch_pc - Π·Π°Ρ‰Π΅Π»ΠΊΠΈΠ²Π°Π½ΠΈΠ΅ PC
  • write_sig - Π·Π°Ρ‰Π΅Π»ΠΊΠΈΠ²Π°Π½ΠΈΠ΅ ячСйки памяти
  • read_sig - выставлСниС значСния ячСйки памяти Π½Π° ΡˆΠΈΠ½Ρƒ Π΄Π°Π½Π½Ρ‹Ρ…

Π€Π»Π°Π³ΠΈ:

  • NZ - 2 Π±ΠΈΡ‚ΠΎΠ²Ρ‹ΠΉ Ρ„Π»Π°Π³. 1 Π±ΠΈΡ‚ ΠΎΡ‚Π²Π΅Ρ‡Π°Π΅Ρ‚ Π·Π° N, 2 Π±ΠΈΡ‚ Π·Π° Z

Register File

register file

РСгистр R0 ΠΈΠΌΠ΅Π΅Ρ‚ подтяТку Π½Π° "0", Ρ‡Ρ‚ΠΎ Π΄Π΅Π»Π°Π΅Ρ‚ Π΅Π³ΠΎ Π½Π΅ нСизмСняСмым

Control Unit

control unit

Control Unit Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½ Π² классС ControlUnit

Π’Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ микроинструкций просисходит Π² ΠΌΠ΅Ρ‚ΠΎΠ΄Π΅ execute_signal

Π¦ΠΈΠΊΠ» осущСствляСтся Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ run_simulation. Π’ Π½Π΅ΠΌ выполняСтся Π΄Π΅ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ инструкций

Π‘ΠΈΠ³Π½Π°Π»Ρ‹ sel_twice_inc_if_n ΠΈ sel_twice_inc_if_z ΠΎΡ‚Π²Π΅Ρ‡Π°ΡŽΡ‚ Π·Π° ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ Ρ€Π°Π·ΠΌΠ΅Ρ€Π° ΠΈΠ½ΠΊΡ€ΠΌΠ΅Π½Ρ‚Π° ΠΏΡ€ΠΈ Π½Π°Π»ΠΈΡ‡ΠΈΠΈ Ρ„Π»Π°Π³ΠΎΠ² N, Z

Π‘ΠΈΠ³Π½Π°Π» sel_one_inc устанавливаСт шаг ΠΈΠ½ΠΊΡ€Π΅ΠΌΠ΅Π½Ρ‚Π° Ρ€Π°Π²Π½Ρ‹ΠΉ 1

ΠŸΡ€ΠΈΡΡƒΡ‚ΡΡ‚Π²ΡƒΠ΅Ρ‚ 24-Π±ΠΈΡ‚Π½Ρ‹ΠΉ рСгистр для хранСния ΠΎΠΏΠ΅Ρ€Π°Π½Π΄ΠΎΠ² инструкции для ΠΏΠΎΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ Ρ€Π°Π±ΠΎΡ‚Ρ‹ с Π½ΠΈΠΌΠΈ

Decoder опрСдСляСт opcode для ΠΌΠΈΠΊΡ€ΠΎΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ ΠΈ отдСляСт ΠΎΠΏΠ΅Ρ€Π°Π½Π΄Ρ‹

Для ΠΆΡƒΡ€Π½Π°Π»Π° состояний процСссора ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ стандартный ΠΌΠΎΠ΄ΡƒΠ»ΡŒ logging.

ΠžΡΡ‚Π°Π½ΠΎΠ²ΠΊΠ° модСлирования Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Π° ΠΏΡ€ΠΈ:

  • ΠΏΡ€Π΅Π²Ρ‹ΡˆΠ΅Π½ΠΈΠΈ Π»ΠΈΠΌΠΈΡ‚Π° Ρ‚ΠΈΠΊΠΎΠ²
  • ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΈ StopIteration - Ссли Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½Π° инструкция HALT
  • ΠΎΠ±Ρ€Π°Ρ‰Π΅Π½ΠΈΠΈ ΠΊ пустому Π±ΡƒΡ„Π΅Ρ€Ρƒ in

ВСстированиС

  • ВСстированиС осущСствляСтся ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ golden test-ΠΎΠ²
  • Настройка golden тСстирования находится Π² golden_test.py
  • ΠšΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡ golden test-ΠΎΠ² Π»Π΅ΠΆΠΈΡ‚ Π² Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΠΈ golden

Π—Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ тСсты - poetry run pytest . -v

ΠžΠ±Π½ΠΎΠ²ΠΈΡ‚ΡŒ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡŽ golden test-ΠΎΠ² - poetry run pytest . -v --update-goldens

CI ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ Github Actions:

name: Check Python

on:
  push:
    branches:
      - main

jobs:
  test:
    runs-on: ubuntu-latest

    steps:
      - name: Checkout code
        uses: actions/checkout@v4

      - name: Set up Python
        uses: actions/setup-python@v4
        with:
          python-version: 3.12

      - name: Install dependencies
        run: |
          python3 -m pip install --upgrade pip
          pip3 install poetry
          poetry install

      - name: Run tests and collect coverage
        run: |
          poetry run coverage run -m pytest .
          poetry run coverage report -m
        env:
          CI: true

  lint:
    runs-on: ubuntu-latest

    steps:
      - name: Checkout code
        uses: actions/checkout@v4

      - name: Set up Python
        uses: actions/setup-python@v4
        with:
          python-version: 3.12

      - name: Install dependencies
        run: |
          python3 -m pip install --upgrade pip
          pip3 install poetry
          poetry install

      - name: Check code formatting with Ruff
        run: poetry run ruff format --check .

      - name: Run Ruff linters
        run: poetry run ruff check .

Π³Π΄Π΅:

  • poetry - ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ зависимостями для языка Pyuthon
  • coverage - Ρ„ΠΎΡ€ΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΎΡ‚Ρ‡Ρ‘Ρ‚Π° ΠΎΠ± ΡƒΡ€ΠΎΠ²Π½Π΅ покрытия исходного ΠΊΠΎΠ΄Π°
  • pytest - ΡƒΡ‚ΠΈΠ»ΠΈΡ‚Π° для запуска тСстов
  • ruff - ΡƒΡ‚ΠΈΠ»ΠΈΡ‚Π° для форматирования ΠΈ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ стиля кодирования

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ ΠΆΡƒΡ€Π½Π°Π»Π° Ρ€Π°Π±ΠΎΡ‚Ρ‹ Π½Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ add

Instruction fetch ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΌΠΈΠΊΡ€ΠΎΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ 6: ADD (2 Ρ‚ΠΈΠΊΠ°)

 DEBUG   machine:run_simulation Machine state: IR(0), MPC(1), PC(1), REGISTERS([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]), NZ(0), TICKS(1), MC_COUNTER(5)
 DEBUG   machine:run_simulation Machine state: IR(6), MPC(2), PC(1), REGISTERS([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]), NZ(0), TICKS(2), MC_COUNTER(9)
 DEBUG   machine:run_simulation Machine state: IR(6), MPC(6), PC(1), REGISTERS([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]), NZ(0), TICKS(3), MC_COUNTER(11)
 DEBUG   machine:run_simulation Machine state: IR(6), MPC(7), PC(1), REGISTERS([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1]), NZ(0), TICKS(4), MC_COUNTER(15)
 ...

Π–ΡƒΡ€Π½Π°Π» Ρ€Π°Π±ΠΎΡ‚Ρ‹:

StopIteration reason:  HALT
LOC: 6
Ticks:  26
Instructions executed: 6
Microprogram executed: 111
Output(int): [4]
Output(str): ['\x04']

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ тСстирования:

poetry run pytest . -vv
============================================================================================ test session starts =============================================================================================
platform linux -- Python 3.12.3, pytest-7.4.4, pluggy-1.5.0 -- /home/kxrxh/Dev/ITMO/CA-Experiment/.venv/bin/python
cachedir: .pytest_cache
rootdir: /home/kxrxh/Dev/ITMO/ca-lab3
configfile: pyproject.toml
plugins: golden-0.2.2
collected 6 items                                                                                                                                                                                            

golden_test.py::test_translator_and_machine[golden/prob2.yml] PASSED                                                                                                                                   [ 16%]
golden_test.py::test_translator_and_machine[golden/helloworld.yml] PASSED                                                                                                                              [ 33%]
golden_test.py::test_translator_and_machine[golden/hello_user.yml] PASSED                                                                                                                              [ 50%]
golden_test.py::test_translator_and_machine[golden/cat.yml] PASSED                                                                                                                                     [ 66%]
golden_test.py::test_translator_and_machine[golden/add.yml] PASSED                                                                                                                                     [ 83%]
golden_test.py::test_translator_and_machine[golden/all_instr.yml] PASSED                                                                                                                               [100%]

============================================================================================= 6 passed in 0.27s ==============================================================================================
| ЀИО                             | Π°Π»Π³             | LoC | code инстр. | Ρ‚Π°ΠΊΡ‚. | ΠΌΠΈΠΊΡ€ΠΏ. |
| ΠŸΠ°Ρ€Ρ…ΠΎΠΌΠ΅Π½ΠΊΠΎ ΠšΠΈΡ€ΠΈΠ»Π» АлСксандрович | add             | 6   | 6           | 26    |  111   |
| ΠŸΠ°Ρ€Ρ…ΠΎΠΌΠ΅Π½ΠΊΠΎ ΠšΠΈΡ€ΠΈΠ»Π» АлСксандрович | all_instr       | 29  | 19          | 19    |  357   |
| ΠŸΠ°Ρ€Ρ…ΠΎΠΌΠ΅Π½ΠΊΠΎ ΠšΠΈΡ€ΠΈΠ»Π» АлСксандрович | cat             | 6   | 71          | 353   |  1451  | 
| ΠŸΠ°Ρ€Ρ…ΠΎΠΌΠ΅Π½ΠΊΠΎ ΠšΠΈΡ€ΠΈΠ»Π» АлСксандрович | hello_user      | 13  | 63          | 303   |  1181  |
| ΠŸΠ°Ρ€Ρ…ΠΎΠΌΠ΅Π½ΠΊΠΎ ΠšΠΈΡ€ΠΈΠ»Π» АлСксандрович | helloworld      | 8   | 70          | 336   |  1320  |
| ΠŸΠ°Ρ€Ρ…ΠΎΠΌΠ΅Π½ΠΊΠΎ ΠšΠΈΡ€ΠΈΠ»Π» АлСксандрович | prob2           | 16  | 244         | 1143  |  4676  |

About

Simple model of CPU (RISC) + ASM

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Languages