2016-03-29 31 views
0

说我有下面的代码:在Verilog的,我怎么使用一个变量在逻辑

genvar i,j; 
generate 
for(i = 0; i < MAX; i = i + 1) begin: gen_blah 
    for(j = 0; j < MAX; j = j + 1) begin: gen_foo 
    assign match[i] = entry[j] = i; 
    end 
end 
endgenerate 

这是一个综合的体现在哪里?看起来应该是这样,因为这只会展开成一堆比较至常量的分配。如果不是的话,我会如何写这个来完成呢?

+3

您是否在实际的综合和实施工作流程中尝试了此代码?查看诸如ISE提供的RTL和技术原理图,以及任何合成工具输出或警告,可能会非常有帮助。 – hexafraction

回答

1

不是。想象一下展开这个并用手输入它。拳头两条线会导致多重驱动网:

assign match[0] = (entry[0] == 0); 
assign match[0] = (entry[1] == 0); 

但是,如果你摆脱生成的,并为此与内部的循环,然后总是阻止它会工作:

always_comb begin 
    for(int i = 0; i < MAX; i = i + 1) begin: gen_blah 
    for(int j = 0; j < MAX; j = j + 1) begin: gen_foo 
     match[i] = (entry[j] == i); 
    end 
    end 
end 

这里面阻止你获得多个分配给相同的值,但最后一个“获胜”。我不确定你想用你的代码来完成什么,所以这可能不会实际执行你正在寻找的功能。如果您试图查看是否有任何条目等于i那么您应该将其更改为:

always_comb begin 
    for(int i = 0; i < MAX; i = i + 1) begin: gen_blah 
    match[i]=0; 
    for(int j = 0; j < MAX; j = j + 1) begin: gen_foo 
     match[i] = match[i] || (entry[j] == i); 
    end 
    end 
end 
相关问题