在 RISC-V 非特权规范 V20191213 中,说明了以下内容(第 21 页)
无条件跳转指令均使用 PC 相对寻址来帮助支持位置无关代码。
查看JALR指令的定义,
间接跳转指令JALR(跳转链接寄存器)采用I型编码。通过将符号扩展的 12 位 I 立即数与寄存器 rs1 相加,然后将结果的最低有效位设置为零来获得目标地址。
这个地址计算显然与PC无关。那么,为什么规范声称所有跳转指令都使用 PC 相对寻址呢?
另外,PC 相对寻址如何支持位置无关代码?难道不应该是完全相反的吗?
assembly instruction-set cpu-architecture riscv position-independent-code
#include <iostream>
int main()
{
int number=65536;
long long temp=number*number;
std::cout << temp << std::endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
广场65536明显超出了int范围.现在,如果我宣布temp为int,我会理解为什么这会失败.但即便如此long long,输出总是如此0.我相信这与隐式类型转换有些相关,但我不明白为什么结果如此0.
这是因为c ++根本不允许转换int为long?如果是这样,为什么这个数字较小?
我正在尝试打印随机浮点(32 位)值。我尝试uniform_real_distribution为此目的使用。我写了以下代码,
int main()
{
std::random_device rd{};
std::mt19937 gen{rd()};
std::uniform_real_distribution<float> dist(-1e18,1e18);
float random_val = dist(gen);
printf("%.20f\n", random_val);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
现在,输出很奇怪。我得到的只是非常大的数字(总是接近上限或下限),没有分数。以下是我看到的一些输出,
-149399166081040384.00000000000000000000
128349565723082752.00000000000000000000
-323890424458510336.00000000000000000000
802221481969844224.00000000000000000000
817395979383734272.00000000000000000000
Run Code Online (Sandbox Code Playgroud)
他们总是这样,我换个界限也无所谓。这里有什么问题?
假设我有以下模块定义,
module foo(b)
input b;
parameter length = 8;
reg [length-1:0] dummy ;
Run Code Online (Sandbox Code Playgroud)
现在,我想为这个虚拟数组赋值。例如,我想将其全部设为 1。如果长度没有参数化,我可以这样做,
always @(posedge b)
dummy <= 8'hFF;
Run Code Online (Sandbox Code Playgroud)
但是当长度被参数化时,我希望这样做,
always @(posedge b)
dummy <= length'hFFFF //won't even compile. even if it did, how many F's should there be?
Run Code Online (Sandbox Code Playgroud)
如何将一个(或零)分配给长度已参数化的整个数组?或者更一般地说,如何在指定参数化数组的长度时分配值?