You are on page 1of 9

Други домаћи задатак

Dataflow рачунари и њихова


примена
Студенти: Професори:
Илија Гавриловић 1it/2023 др Вељко Милутиновић
Милица Дојчиновић 14it/2023 др Милош Котлар

1/9
Симулатор кеш меморије - VERILOG
• Да бисмо симулирали кеш меморију помоћу Верилог језика, прво
морамо изнети основни концепт кеш меморије.
• Кеш меморија је брза меморија која се користи за складиштење
података који се често користе како би се смањило време
приступа главној меморији.
• Постоје различите врсте кеш меморија, али овде ћемо
размотрити једноставан пример директно мапиране кеш
меморије.

2/9
• Прво, дефинисаћемо неколико битних компоненти кеш
меморије:
1. Tag меморија: Чува тагове који идентификују које блокове из
главне меморије чува у кешу.
2. DATA меморија: Садржи податке који су стварно смештени у
кешу.
3. Valid битови: Сваки ред кеш меморије има валид бит који
означава да ли је ред активан или празан.

3/9
• module Cache ( • always @(posedge clk or posedge rst) begin
• input wire clk, // Takt • if (rst) begin
• input wire rst, // Reset • // Resetovanje keša
• input wire [31:0] addr, // Adresa za pristup • tag <= 0;
• input wire [31:0] data_in, // Podaci koji se upisuju u keš • data <= 0;
• input wire write_enable, // Omogući pisanje u keš • valid <= 0;
• • end else begin
• output wire [31:0] data_out // Podaci koji se čitaju iz keša • // Pristup kešu
• ); • if (write_enable) begin
• // Parametri keš memorije • // Pisanje u keš
• parameter CACHE_SIZE = 4; // Veličina keša (broj redova) • tag[addr[ADDR_WIDTH-1:INDEX_BITS+OFFSET_BITS]] <=
addr[TAG_BITS+INDEX_BITS+OFFSET_BITS-1:INDEX_BITS+OFFSET_BITS];
• parameter BLOCK_SIZE = 4; // Veličina bloka u bajtovima
• data[addr[ADDR_WIDTH-1:INDEX_BITS+OFFSET_BITS]] <= data_in;
• parameter ADDR_WIDTH = 32; // Širina adrese
• valid[addr[ADDR_WIDTH-1:INDEX_BITS+OFFSET_BITS]] <= 1;

• end else begin
• // Broj bitova za indeks reda i offset bloka
• // Čitanje iz keša
• localparam INDEX_BITS = $clog2(CACHE_SIZE);
• if (valid[addr[ADDR_WIDTH-1:INDEX_BITS+OFFSET_BITS]]) begin
• localparam OFFSET_BITS = $clog2(BLOCK_SIZE);
• data_out <= data[addr[ADDR_WIDTH-1:INDEX_BITS+OFFSET_BITS]];

• end else begin
• // Računanje broja bitova za tag
• data_out <= 0; // Ako red nije aktivan, vraćamo nulu
• localparam TAG_BITS = ADDR_WIDTH - INDEX_BITS - OFFSET_BITS;
• end

• end
• // Deklaracije signala
• end
• reg [TAG_BITS-1:0] tag [0:CACHE_SIZE-1];
• end
• reg [31:0] data [0:CACHE_SIZE-1]; 4/9
• endmodule
• reg valid [0:CACHE_SIZE-1]; // Proces za čitanje i pisanje u keš
Шема кеш меморије

5/9
Симулација Фон Нојманове архитектуре
• Симулација Фон Нојмановог језгра у Верилогу укључује
описивање архитектуре језгра помоћу Верилог језика за опис
хардвера (HDL). Фон Нојмановo језгро је типично састављено од
процесорског блока, контролне јединице, меморије и
улазно/излазних јединица.
• Ево једноставног примера Верилог кода који илуструје основну
структуру вон Фон Нојмановог језгра:

6/9
• module VonNeumannCore ( • endcase
• input wire clk, // Clock signal • end end
• input wire rst, // Reset signal • // Memory access
• input wire [7:0] instr, // Instruction input (8-bit instruction) • always @ (posedge clk or posedge rst)
• input wire [7:0] data_in, // Data input • begin
• output wire [7:0] data_out // Data output • if (rst)
• ); • memory <= 256'h0000; // Reset memory to zeros
• // Register definitions • else
• reg [7:0] accumulator; // Accumulator register • begin
• reg [7:0] memory [255:0]; // Memory array with 256 8-bit locations • if (instr[7]) // If MSB of instruction is 1, it's a memory write operation
• // Program Counter (PC) register • memory[instr[6:0]] <= data_in;
• reg [7:0] pc; • else // If MSB is 0, it's a memory read operation
• // ALU (Arithmetic Logic Unit) • data_out <= memory[instr[6:0]];
• always @ (posedge clk or posedge rst) • end
• begin • end
• if (rst) • // Program Counter (PC) update
• accumulator <= 8'b0; // Reset accumulator to zero • always @ (posedge clk or posedge rst)
• else • begin
• begin • if (rst)
• // Decode and execute instructions • pc <= 8'b0; // Reset PC to zero
• case (instr) • else
• 8'b00000000: accumulator <= accumulator + data_in; // ADD • pc <= pc + 1; // Increment PC
• 8'b00000001: accumulator <= accumulator - data_in; // SUB • end
• // Add more instructions as needed
• default: accumulator <= accumulator; // Default: No operation • endmodule 7/9
Шема основне Фон Нојманове
архитектуре

8/9
Хвала на пажњи!

9/9

You might also like