0

我正在使用 C++ 使用 SystemC 进行基于硬件的模型设计。SystemC 作为 C++ 扩展引入了对信号和字节描述有用的特定数据类型。

通常如何访问数据类型的第一位,例如:

sc_bv<16> R0;

或访问tmp.

int my_array[42];
int tmp = my_array[1];

sc_bv 是一种位向量数据类型,用于存储二进制序列。现在我想要该数据类型的前四位,例如。我的背景是 C# 和 Java,因此我通常会怀念一些基于 OOP 和反射的 API 结构。我需要对这个低级的东西进行转换。有用的介绍性内容会有很大帮助。

谢谢:),希望

4

4 回答 4

2

对于sc_bv,您可以使用索引运算符[]

对于 int,只需对常量使用正常的按位运算,例如 int 中的最低有效位tmptmp & 1

于 2010-11-22T14:19:26.870 回答
1

我真的不能为 SystemC 说话(虽然听起来很有趣)。在普通 C 语言中,您会使用如下掩码读取低四位:

temp = R0 & 0xf;

并只写入低四位(假设是 32 位寄存器,并且 temp<16),如下所示:

R0 = (R0 & 0xfffffff0) | temp;
于 2010-11-22T14:17:57.053 回答
1

要访问 tmp 的前四个(我假设您的意思是四个最高位)位(即获取它们的值),您使用位掩码。因此,如果您想知道是否设置了第二个位,请执行以下操作:

int second_bit = (tmp & 0x4000000) >> 30;

现在second_bit1如果该位被设置,否则为零。这背后的想法如下:

想象一下 tmp 是(二进制)现在您使用具有以下值
1101 0000 0000 0000 0000 0000 0000 0000
的按位 AND ( the )当且仅当两个操作数都设置了相应的位(它们都是)时, ANDing 在给定位上产生 a 。所以结果将是: 然后将这 30 位向右移动,这使得它成为: 请注意,如果原始值的测试位为零,则结果将为零。&
0100 0000 0000 0000 0000 0000 0000 0000 // which is 0x40000000 in hex
11
0100 0000 0000 0000 0000 0000 0000 0000

0000 0000 0000 0000 0000 0000 0000 0001 \\ which is 1

这样你就可以测试你喜欢的任何位,你只需要提供正确的掩码。请注意,我在这里假设 int 是 32 位宽,这在大多数情况下应该是正确的。

于 2010-11-22T14:21:17.173 回答
1

您必须更多地了解 sc_bv 以确保您获得正确的信息。另外,当您说“前四个字节”时,我假设您的意思是“前四个位”。但是,这也具有误导性,因为您确实想在低位或高位之间划定界限。

无论如何,您使用 C 位运算符来处理这种事情。但是,您将需要知道整数值的大小和运行时架构的“字节序”才能做到这一点。

但是,如果你真的只想要前四位,那么你会做这样的事情......

inline unsigned char
first_4_bits(void const * ptr)
{
  return (*reinterpret_cast<unsigned char const *>(ptr) & 0xf0) >> 4;
}

这将抓住它所指向的前 4 位。所以,如果指向的第一个字节是 0x38,那么这个函数将返回前 4 位,所以结果是 3。

于 2010-11-22T14:32:10.220 回答