我正在用verilog实现一个RISC V rv32i。
在ram访问中,目前我设计了一个宽度为8的ram。因此,对于写入和读取1个字,在1个周期内读取4个位置。类似地,对于半字读取2个位置,对于字节读取1个位置。
这是在这样的印象下完成的,即存储字节的地址可以是1字节对齐的,而存储半字的地址是2字节对齐的。虽然这在模拟中起作用,但这会导致无法合成的设计。因此,我正在尝试重新设计ram控制器。
在我的重新设计中,宽度为32将合成,但如果半字写入0x8004,则0x8006将不可用。我们能假设所有到内存的地址都是4字节对齐的吗?或者它在SW,SH,SB之间是不同的?
此安排是否会违反RISC-V合规性?
发布于 2021-07-05 00:38:11
对齐的概念取决于数据的大小。虽然对于字节大小的数据没有对齐的概念,但是对于半字(2字节)数据,任何字节都可能是可访问的(我们可以说所有字节地址都是对齐的). ,对于字数据,地址或者是偶数(对齐),或者是奇数(未对齐)。地址要么是4的倍数(对齐),要么是未对齐的。
RISC V要求指令正确对齐,但数据字并非如此。然而,对于未对齐的访问,合法实现的执行速度可能会异常缓慢。*换句话说,只要存在可以执行未对齐访问的软件异常处理程序,即使软件异常处理程序比对齐地址慢100倍,您也可以在未对齐的访问上产生错误(接受异常)的实现。
来自https://inst.eecs.berkeley.edu/~cs61c/sp19/lectures/lec05.pdf
·RISC-V不要求整数字对齐...
但如果你不确保它们是……那就非常非常糟糕。
·未对齐整数的后果
·速度减慢:当发生这种情况时,允许处理器慢很多
但是,未对齐的加载可能需要数百倍的时间!
·缺乏原子性:整个事情不会立即发生……可以引入很多非常微妙的bug
然而,用户将期望对齐的访问全速运行。例如,字符串的每个字节都应该是可访问的(作为字节),因此对于字节大小的访问,在奇数地址上出错(对于缓慢的异常处理程序)是不可取的。对于半个字也是如此,每个偶数地址都应该允许全性能;而对于字,因为4字节对齐的地址具有全性能的期望。
编译器可以很容易地对齐数据结构,以防止大多数情况下的错误对齐,并且很可能会在RISC V.中这样做。(一些编译器具有允许打包数据结构的错误对齐的指令,以牺牲性能的大小改进。)
https://stackoverflow.com/questions/68245606
复制相似问题