verilog - always_comb 中的临时变量会创建锁存器吗
问题描述
我有以下代码片段,其中临时变量用于计算数组中 1 的数量:
// count the number 1s in array
logic [5:0] count_v; //temp
always_comb begin
count_v = arr[0];
if (valid) begin
for (int i=1; i<=31; i++) begin
count_v = arr[i] + count_v;
end
end
final_count = count_v;
end
这个逻辑会为 count_v 创建一个锁存器吗?综合工具是否足够智能以正确综合此逻辑?我正在努力为这类场景找到任何编码建议。
另一个例子:
logic temp; // temp variable
always_comb begin
temp = 0;
for (int i=0; i<32; i++) begin
if (i>=start) begin
out_data[temp*8 +: 8] = in_data[i*8 +: 8];
temp = temp + 1'b1;
end
end
end
解决方案
抱歉,Eddy Yau,我们似乎正在就您的帖子进行一些讨论。
这是一些示例代码:
module latch_or_not (
input cond,
input [3:0] v_in,
output reg latch,
output reg [2:0] comb1,
output reg [2:0] comb2
);
reg [2:0] temp;
reg [2:0] comb_loop;
// Make a latch
always @( * )
if (cond)
latch = v_in[0];
always @( * )
begin : aw1
integer i;
for (i=0; i<4; i=i+1)
comb_loop = comb_loop + v_in[i];
comb2 = comb_loop;
end
always @( * )
begin : aw2
integer i;
temp = 7;
for (i=0; i<4; i=i+1)
temp = temp - v_in[i];
comb1 = temp;
end
endmodule
如果按照 Xilinx Vivado 工具经过细化后得出的结果是这样的:
'latch' 输出很明显。您还会注意到 temp 不存在于最终结果中。
'comb_loop' 不是锁存器,但更糟糕的是:它是一个组合循环。逻辑的输出返回到输入。绝对不!
推荐阅读
- loops - For 循环在 Dart 中表现得很奇怪。我正在尝试制作一个异步函数来检索数据
- reactjs - 幻灯片放映反应
- javascript - 尝试获取对象时无法设置未定义的属性“id”
- c# - 为什么数据源中没有数据对象?(数据源配置向导)
- node.js - 如何使用 Express/Mysql 将用户数据从 nodeJS 传递到 reactJS
- python - Python通过电子邮件发送pdf得到意外的关键字参数'main_type'
- python - Django Json 响应 - 显示计数字段的问题
- python - 从字典输出中获取元素
- angular - Angular路由器很慢
- javascript - 数据移动到单独的组件时重新渲染过多