gpt4 book ai didi

verilog - 如何以现实的方式实现存储字节和存储半字

转载 作者:行者123 更新时间:2023-12-02 08:00:10 36 4
gpt4 key购买 nike

我正在实现一个单周期 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
...

如果不是传统的实现方式,这是否现实?

我正在研究它作为一种爱好,如果我的问题看起来很愚蠢,抱歉

最佳答案

RAM 的主索引必须始终是字地址。我假设半字写可以是字的上半部分和下半部分,字节写可以分配给字内的任何字节。

您可以使用 +: 切片运算符(参见 Indexing vectors and arrays with +: )来分配单词的一部分

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 语句的效率。您需要进行试验。

关于verilog - 如何以现实的方式实现存储字节和存储半字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58305689/

36 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com