gpt4 book ai didi

hardware - 使用 for 循环在 Verilog 中指定变量范围

转载 作者:行者123 更新时间:2023-12-01 16:34:41 26 4
gpt4 key购买 nike

我正在尝试编写这段代码:

 for (i = 0; i <= CONST - 1'b1; i = i + 1'b1)
begin : loop_inst

if (i < 3)
begin
if (changed[i] & !done_q[i])
begin
writedata[3-i] = en[i];
writedata[2-i:0] = readdata[2-i:0];
writedata[15:4-i] = readdata[15:4-i];
end
end
else
...

基本上,我尝试写入的位 (en) 的位置会根据我正在通话的地址而变化,具体取决于 i。此代码不可综合,因为 i 不是常量。

还有其他解决方法吗?我知道的唯一解决方法是连续多次写出这三个语句。我希望我最终不必这样做。还有其他解决办法吗?

最佳答案

看起来您一直在尝试将 readdata 复制到 writedata,但如果某些特殊情况,请用 en 填充 LSB情况条件满足。我还将假设您的 for 循环位于 always block 中,并且您打算构建组合逻辑。

从硬件角度来看,您编写的for循环对我来说没有多大意义。 for 循环用于构建逻辑数组,正如您所见写完后,您将至少有 3 个逻辑锥尝试在整个 writedata 总线上设置值。 (如果它生成任何东西,那将是一些奇怪的优先级结构)。

也就是说,编译器可能会提示范围选择,即 writedata[2-i:0] 而不是 writedata[3-i] = en[ i]; (部分选择中带有 : 的任何内容)。如果您想按照这些方式执行某些操作,可以使用“索引部分选择”(+:-:),但在这种情况下有更好的解决方案。

我将其重写如下 - 假设我假设正确:)

always @( /*whatever*/ ) begin

// default assignment
writedata = readdata;

// overwrite some bits in writedata for special cases
for(i=0; i<3; i++) begin
if( changed[i] & !done_q[i] )
writedata[3-i] = en[i];
end
end

在此代码中,我将 writedata 设置为 readdata,然后在特殊情况下调整 writedata 的结果值玩。 for 循环正在构建 3 个逻辑锥,一个对应于 writedata[3:1] 中的每一位。我会仔细检查位映射是否符合您的预期 - 即,将 en[2:0] 映射到 writedata[1:3]

关于hardware - 使用 for 循环在 Verilog 中指定变量范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6847728/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com