我有以下代码片段,其中使用temp变量来计算数组中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发布于 2018-07-02 14:46:51
一般规则:如果在写入之前读取变量,那么您的代码暗示了某种类型的内存。在这种情况下,模拟器和合成器都必须存储先前的值,因此合成器将为您提供一个寄存器或锁存器。您的两个示例在读取临时值之前都会写入它,因此不会隐含任何存储空间。
它是合成的吗?试试看。我在产品代码中见过很多这样的东西,并且它可以工作(使用我使用过的synths ),但我自己不这样做。我会尝试一下,看看创建了什么逻辑,并用它来决定您是否需要更多地考虑它。没有循环,计算设置位很容易,但是count循环几乎肯定会与synth一起工作。第二个例子可能更有问题。
发布于 2018-07-02 16:04:18
对于任何具有确定性初始赋值的always块,它不会生成除逻辑环路以外的锁存器。
发布于 2018-07-02 18:13:14
对不起,埃迪·尤,关于你的帖子,我们似乎正在进行一些讨论。
下面是一些示例代码:
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”不是一个锁存器,更糟糕的是:它是一个组合循环。逻辑的输出返回到输入。绝对不能!

https://stackoverflow.com/questions/51128577
复制相似问题