Verilog定义向量的数组后如何选择某个向量?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Verilog定义向量的数组后如何选择某个向量?相关的知识,希望对你有一定的参考价值。

在Verilog中定义了向量的数组后,如何选择其中某个变量?
比如如下定义 reg [15:0] register [15:0]; 如果我想选择第一个向量应该怎么选,是register[0]吗?那如果我要选择第一个向量的第一位呢?是register[0][0]吗?

可以这样写,楼下说的是verilog1995标准。一些比较老的教材也可能用的是老标准,是不支持直接访问数组的一个地址中的某一位或一部分,只能通过一个临时变量访问(楼下已经举例了)。verilog2001开始取消这个限制,直接访问没问题。
摘抄一段verilog2001的介绍:
The Verilog-1995 standard does not permit directly accessing a bit or part select of an array word. A full array word has to copied to a temporary variable, and the bit or part selected from the temporary variable. Verilog-2001 removes this restriction, and allows bit selects and part
selects of array words to be directly accessed. For example:
//select the high-order byte of one word in a
//2-dimensional array of 32-bit reg variables
reg [31:0] array2 [0:255][0:15];//多维数组也被允许了
wire [7:0] out2 = array2[100][7][31:24] ;
参考技术A 不行必须如下写
wire[15:0] wreg = reg[0];

wire bit0 = wreg[0];
参考技术B 呵呵,我觉得也可以这样做

如何将向量转换为 typedef 类型的数组

【中文标题】如何将向量转换为 typedef 类型的数组【英文标题】:How to convert a vector to an array of a typdef type 【发布时间】:2016-04-12 15:25:22 【问题描述】:

我在头文件中定义了一个 typedef:

typedef unsigned char       BYTE;

我有以下代码:

BYTE rgbPlaintext[] = 0x00;
rgbPlaintext* = &vec[0];

vec 是一个由文件填充的unsigned char 数组(没有问题)。我的问题是,上面的代码没有成功构建,它说的是syntax error : '='rgbPlaintext* = &vec[0];

如何成功地将数组指向向量中属于 typedef 基础类型的数组?

谢谢。

【问题讨论】:

停止使用数组。 BYTE *rgbPlaintext = &vec[0]; rgbPlaintext 是一个数组,你不能让它指向另一个数组。你想要什么? 我需要一个 BYTE 数组,以便我可以将它传递给接受 BYTE[] 输入的方法 @ITWorker 可以直接传递&vec[0]。或者将vec的内容复制到rgbPlaintext,然后传递rgbPlaintext @songyuanyao 在这种情况下,如何从向量复制到数组,即使底层类型相同(无符号字符),类型也不同? 【参考方案1】:

我的问题是,上面的代码没有成功构建,它只是在rgbPlaintext* = &vec[0];这一行写了syntax error : '='

您收到错误是因为编译器需要乘法运算符的右手参数,但发现= 不是乘法运算符的有效操作数。我觉得乘法不是你的本意。

如何将向量转换为 typdef 类型的数组

向量不能转换为数组。

也许您的意思是将向量的内容复制到一个数组中。很简单:

std::copy(vec.begin(), vec.end(), rgbPlaintext);

但是,您需要小心。如果数组小于向量,那么它会溢出并且你得到未定义的行为。

如何才能成功地将数组指向...的数组

数组不指向任何东西,你不能让它们指向任何东西。数组包含个对象。

在这种情况下,数组rgbPlaintext 包含一个值为0x00 的元素。您可以使用我展示的方法将向量的内容复制到rgbPlaintext,但是如果向量包含多个元素,则副本会溢出。

如果数组所基于的向量由数据文件填充,如何知道所需数组的大小?

可以使用std::vector::size() 知道向量的大小。但是在编译时无法知道大小,因此如果您打算将内容复制到数组并且无法限制最大大小,那么您不能使用自动或静态分配的数组。您可以使用动态分配的数组,为此,我建议使用std::vector

将一个向量复制到另一个向量很简单:

std::vector<BYTE> rgbPlaintext = vec;

只要BYTEdecltype(vec)::value_type 的类型相同,就可以了。一种类型是否是另一种类型的别名并不重要。

【讨论】:

如果数组所基于的向量由数据文件填充,如何知道所需数组的大小?【参考方案2】:

代码:

rgbPlaintext* = &vec[0]; // vec 是一个无符号字符数组

如另一篇文章所述,语法不正确 rgbPlaintext*。

执行以下操作:

我如何才能成功地将数组指向向量中属于 typedef 基础类型的数组?

我将假设您真正所说的 vec 是来自 std 的向量,其中包含无符号字符数组。如果是这种情况,那么我将执行以下操作:

BYTE* rgbPlaintext = NULL;
rgbPlaintext = vec[0]; // any subscript of the list of arrays
cout << rgbPlainText[0] << endl; // return the first value at sub of array attained from vec

这是一个小测试程序来澄清我的理解:

#include <iostream>
#include <vector>

using namespace std;

int main(int argc, char** argv )

    typedef unsigned char NBYTE;
    typedef vector<NBYTE*> TEST_ARRAYBYTE;

    NBYTE *rgbPlaintext = NULL;
    NBYTE testarray[] =  '2', '1';
    NBYTE testarray1[] =  '1', '2';

    TEST_ARRAYBYTE vec;
    vec.push_back(testarray);
    vec.push_back(testarray1);

    rgbPlaintext = vec[0];

    cout << rgbPlaintext[0] << endl;
    rgbPlaintext = vec[1];
    cout << rgbPlaintext[0] << endl;


【讨论】:

以上是关于Verilog定义向量的数组后如何选择某个向量?的主要内容,如果未能解决你的问题,请参考以下文章

matlab 定义数组问题?

如何从向量或数组中选择最常见的数字?(TOP5 toplist)C++

Verilog矢量包装/拆包宏

如何用向量证ABCD共面?

数组(向量)中大于某个值的元素的起始索引和结束索引

如何将向量序列化为字符数组