Как реализовать сохранение байта и хранение полуслов в реалистичном подходе - PullRequest
2 голосов
/ 09 октября 2019

Я использую экземпляр процессора MIPS с одним циклом. я хочу реализовать хранение половинного слова и сохранение байта

Я добавил новый входной сигнал в свою «память данных» для управления тем, что хранить, как показано ниже.

// this was prof. Harris implementation in "digital design and computer 
// architecture book" implementation before i turn the "we" (Write Enable) signal into 2 bits  

module dmem(input logic clk, [1:0]we, //where we is an output of the control unit
            input logic [31:0] a, wd, 
            output logic [31:0] rd);

logic [31:0] RAM[63:0];

assign rd = RAM[a[31:2]]; // word aligned

always_ff @(posedge clk)
    case(we)
        2'b01: RAM[a[31:2]] <= wd; // sw 
        2'b10: RAM[a[31:0]][15:0] <= wd[15:0]; // sh
        2'b11: RAM[a[31:0]][7:0] <= wd[7:0]; // sb
        default:
        // do nothing
        ...

Реально ли это, если не так, как это принято делать?

Я изучаю это как хобби, извините, если мой вопрос кажется глупым

Ответы [ 2 ]

3 голосов
/ 09 октября 2019

Основным индексом для ОЗУ всегда должен быть адрес слова. Я предполагаю, что запись в половинное слово может выполнять верхнюю и нижнюю части слова, а запись байта может назначать любой байт в слове.

Вы можете использовать оператор среза +: (см. Индексирование векторови массивы с +: ) для присвоения части слова

always @(posedge clk) // NOTE: always_ff is SystemVerilog
  case(we)
    2'b01: RAM[a[31:2]] <= wd; // sw 
    2'b10: RAM[a[31:2]][ {a[1],4'b0000} +: 16] <= wd[15:0]; // sh
    2'b11: RAM[a[31:2]][ {a[1:0],3'b000} +: 8] <= wd[7:0]; // sb
    default:
    // do nothing
  endcase

В SystemVerilog также есть опция многомерных упакованных массивов

//    [shw][sby][dat]    [sw  ]
logic [1:0][1:0][7:0] RAM[63:0];

assign rd = RAM[a[31:2]]; // word aligned

always_ff @(posedge clk)
  case(we)
    2'b01: RAM[a[31:2]] <= wd; // sw 
    2'b10: RAM[a[31:2]][a[1]] <= wd[15:0]; // sh
    2'b11: RAM[a[31:2]][a[1]][a[0]] <= wd[7:0]; // sb
    default:
    // do nothing
  endcase

ДонНе знаю, насколько хорошо большинство синтезаторов будут обрабатывать многомерные упакованные массивы. Любой синтезатор, совместимый с IEEE1364-2001 или более поздней версией, будет поддерживать +:, однако я видел смешанные результаты в том, насколько эффективны результаты сравнения вложенных операторов case. Вам нужно будет поэкспериментировать.

3 голосов
/ 09 октября 2019

Ваша память использует адреса слов, нет? Я говорю это, потому что элементы имеют размер слова.

Таким образом, мы должны использовать адрес слова для их индексации, поэтому вам придется использовать [31: 2] для всех типов магазинов, а непросто sw.

Половина магазина (sh) перейдет в ОЗУ [a [31: 2]] [15: 0], если значение a [1] равно / 0, а [31:16] если a [1] нечетно / 1. (Предполагая, что они имеют младший порядок байтов - поменяйте их местами, если они имеют старший порядок байтов.)

Байт хранилища будет перемещен в ОЗУ [a [31: 2]] [7: 0], если a [1: 0] равно 2'b00,[15: 8] если 2'b01, [23:16] если 2'b10, и [31:24] если 2'b11.


В качестве альтернативы, вы можете моделировать ОЗУ, используя байты, итогда sb будет тривиальным, в то время как sh и sw будут более сложными: sw потребует обновления 4 разных мест в ОЗУ, поскольку они являются байтами в этой схеме.

...