verilog中如何将二维存储器转为一维的数组并赋值,求大神帮忙!

这个东西是一个FPGA模块,看代码。
写入哪个内存,有写操作和读操作。
用Verilog语言编写。
说实话,挺复杂的,我也不是很明白。

首先看输入输出,inputwireclk是时钟,inputwirerst_n是复位,inputwireram_cs是片选,inputwire[2 :0]ram_addr是地址,inputwire[5 :0]ram_din是数据写入。
outputreg[5 :0]ram_dout是读取数据的,outputreg[3 5 :0]ram_bits是什么,我不明白。

参数定义了某些值,val_0到val_5 ,它们都是6 位十六进制数。
然后是mem内存,地址为0到5 ,5 位宽。

ram_wr_act 是写使能的,ram_cs 和 ram_wr_en 在一起并且地址小于 6 才有效。
复位时,存储器将使用值 val_0 至 val_5 进行初始化。
写入时,将ram_din写入对应的地址。

读使能是ram_rd_act,读数据在复位时被清除。
读取时,将数据读取到ram_dout中对应的内存地址。

ram_bits这部分比较复杂。
每个写操作根据地址将 ram_din 放置在特定的 ram_bit 位置。
地址0放在底部5 位,地址1 放在中间5 位,以此类推,直到地址5
说实话,当我看到这段代码时,我有点困惑。
当时我不明白ram_bits在做什么。
这可能是一种特殊的数据格式吗?

SystemVerilog中数组的赋值、索引和切片

嘿,让我告诉你一件事,在 SystemVerilog 中使用数组确实很方便,但也很容易遇到麻烦。
让我告诉你我曾经踩过的陷阱。

前年我在北京做一个项目。
客户要求我们使用三维数组来存储雷达信号数据。
起初我认为它非常先进,但当我运行代码时,我开始不断出现错误。
后来我发现我忘了检查数组赋值的类型和大小。
大家想一想,如果逻辑类型和整数类型混合在一起,肯定会出现问题。
当时我们整个项目就延迟了一个月,真的很痛苦。

单个元素的赋值不是问题。
我去年在西安做过FPGA验证。
为了给一维数组赋值,我直接使用索引,像这样:arr[3 ] = 5 ;。
很简单,没有什么大问题。

给子数组赋值时要小心。
去年之前我就告诉过你,不要只看代码,要看双方是否兼容。
我当时没注意,把一个二维数组的子数组赋值给了另一个数组的子数组。
结果两边的大小不一样,程序直接崩溃了。
那时,我差点被老板解雇。

整行或整列赋值,要看具体情况。
我在深圳做过一个项目。
客户要求我们快速传输数据,所以我尽力指定这些值。
使用的行,例如:array[1 ] =other_array[0];。
结果数据传输速度确实很快,但是后来发现有些数据传输不正确,因为两边的数据不匹配。
当时我花了整整两周的时间才弄清楚这个问题。

索引没什么好说的,用方括号就行了。
我在上海做过一个项目,使用索引来访问数组元素,如下所示:array[3 ]。
非常方便,没有出现任何问题。

切片操作时,需要注意范围。
我在广州做一个项目,使用切片来访问部分数组元素,如下所示:array[0:3 ]。
结果忘记写范围了,直接访问了整个数组,导致程序超时。
当时我差点被顾客骂了。

总而言之,SystemVerilog中的数组操作非常强大,但也很容易陷入困境。
如果你不了解类型和大小兼容性,错误肯定会无处不在。
因此,建议大家在进行数组操作之前仔细研究一下。
不要像我一样,落入陷阱后也不要后悔。

ref 、input、output、inout

Verilog 参数在函数开头复制,输出在函数末尾复制。
SystemVerilog ref 传递引用,更改立即生效。
2 005 年,SystemVerilog添加了一个链接。
价值传递效率低下。
通过引用传递数组具有高性能。
从多个链路端口更新变量时存在争用风险。
ref 只能在自动保存例程中使用。
ref 参数类型必须完全匹配。
const ref 具有只读访问权限。

提醒:ref 参数在任务中的不同存储类中使用时,其行为有所不同。