diff --git a/Labs/03. Register file and memory/README.md b/Labs/03. Register file and memory/README.md index 90b3549..ae8f96f 100644 --- a/Labs/03. Register file and memory/README.md +++ b/Labs/03. Register file and memory/README.md @@ -266,7 +266,7 @@ module instr_mem import memory_pkg::INSTR_MEM_SIZE_BYTES; import memory_pkg::INSTR_MEM_SIZE_WORDS; ( - input logic [31:0] addr_i, + input logic [31:0] read_addr_i, output logic [31:0] read_data_o ); @@ -279,14 +279,14 @@ import memory_pkg::INSTR_MEM_SIZE_WORDS; end // файла program.mem // Реализация асинхронного порта на чтение, где на выход идет ячейка памяти - // инструкций, расположенная по адресу addr_i, в котором обнулены два младших - // бита, а также биты, двоичный вес которых превышает размер памяти данных - // в байтах. + // инструкций, расположенная по адресу read_addr_i, в котором обнулены два + // младших бита, а также биты, двоичный вес которых превышает размер памяти + // данных в байтах. // Два младших бита обнулены, чтобы обеспечить выровненный доступ к памяти, // в то время как старшие биты обнулены, чтобы не дать обращаться в память // по адресам несуществующих ячеек (вместо этого будут выданы данные ячеек, // расположенных по младшим адресам). - assign read_data_o = ROM[addr_i[$clog2(INSTR_MEM_SIZE_BYTES)-1:2]]; + assign read_data_o = ROM[read_addr_i[$clog2(INSTR_MEM_SIZE_BYTES)-1:2]]; endmodule ``` diff --git a/Labs/Made-up modules/lab_03.instr_mem.sv b/Labs/Made-up modules/lab_03.instr_mem.sv index ebec8e6..29f70f6 100644 --- a/Labs/Made-up modules/lab_03.instr_mem.sv +++ b/Labs/Made-up modules/lab_03.instr_mem.sv @@ -8,27 +8,30 @@ See https://github.com/MPSU/APS/blob/master/LICENSE file for licensing details. * ------------------------------------------------------------------------------ */ -module instr_mem( - input logic [31:0] addr_i, - output logic [31:0] read_data_o - ); +module instr_mem +import memory_pkg::INSTR_MEM_SIZE_BYTES; +import memory_pkg::INSTR_MEM_SIZE_WORDS; +( + input logic [31:0] read_addr_i, + output logic [31:0] read_data_o +); -`define akjsdnnaskjdn $clog2(128) -`define cdyfguvhbjnmk $clog2(`akjsdnnaskjdn) -`define qwenklfsaklasd $clog2(`cdyfguvhbjnmk) -`define asdasdhkjasdsa (34 >> `cdyfguvhbjnmk) + logic [31:0] ROM [INSTR_MEM_SIZE_WORDS]; // создать память с + // + // 32-битных ячеек -reg [31:0] RAM [0:1023]; -initial $readmemh("program.mem", RAM); + initial begin + $readmemh("program.mem", ROM); // поместить в память ROM содержимое + end // файла program.mem + + // Реализация асинхронного порта на чтение, где на выход идет ячейка памяти + // инструкций, расположенная по адресу read_addr_i, в котором обнулены два + // младших бита, а также биты, двоичный вес которых превышает размер памяти + // данных в байтах. + // Два младших бита обнулены, чтобы обеспечить выровненный доступ к памяти, + // в то время как старшие биты обнулены, чтобы не дать обращаться в память + // по адресам несуществующих ячеек (вместо этого будут выданы данные ячеек, + // расположенных по младшим адресам). + assign read_data_o = ROM[read_addr_i[$clog2(INSTR_MEM_SIZE_BYTES)-1:2]]; -always_comb begin - read_data_o['h1f:'h1c]=RAM[{2'b00, addr_i[5'd28^5'o27:2]}][{5{1'b1}}:{3'd7,2'b00}]; - read_data_o[42-23-:`asdasdhkjasdsa]=RAM[{2'b00, addr_i[5'h1C-5'd17:2]}][19:{1'b1,4'h0}]; - read_data_o[`akjsdnnaskjdn-:`asdasdhkjasdsa]=RAM[{2'b00, addr_i[5'd28^5'o27:2]}][{3{1'b1}}:{1'b1,2'h0}]; - read_data_o[42-19-:`asdasdhkjasdsa]=RAM[{2'b00, addr_i[5'h1C-5'd17:2]}][23:{{2{2'b10}},1'b0}]; - read_data_o['h1b:'h18]=RAM[{2'b00, addr_i[5'h1C-5'd17:2]}][27:{2'b11,3'b000}]; - read_data_o[`akjsdnnaskjdn+`asdasdhkjasdsa:(`akjsdnnaskjdn+`asdasdhkjasdsa)-`cdyfguvhbjnmk]=RAM[{2'b00, addr_i[5'h1C-5'd17:2]}][11:8]; - read_data_o[`akjsdnnaskjdn-`asdasdhkjasdsa-:`asdasdhkjasdsa]=RAM[{2'b00, addr_i[5'd28^5'o27:2]}][3:0]; - read_data_o[(`akjsdnnaskjdn<<(`asdasdhkjasdsa-`cdyfguvhbjnmk)) + (`asdasdhkjasdsa-`cdyfguvhbjnmk):12 ]=RAM[{2'b00, addr_i[5'h1C-5'd17:2]}][{4{1'b1}}:12]; -end endmodule