2

我尝试运行以下命令并收到此错误:

这是 Verilog 代码:

module needle( input referrence,input  penalty,output index[7:0]);
//inout input_itemsets;
//input referrence;

//input penalty;
//output index;
parameter max_cols=8;
//
wire index[7:0];
wire referrence;
wire penalty;
//wire input_itemsets;
genvar i,idx;
generate
for( i = max_cols-4 ; i >= 0 ; i=i-1)
    for( idx = 0 ; idx <= i ; idx=idx+1)
        begin
             assign index[i] = (idx + 1) * max_cols + (i + 1 - idx);
             //assign index = (idx + 1) * max_cols + (i + 1 - idx);
            //input_itemsets[index] <= maximum( input_itemsets[index-1-max_cols]+ referrence[index],
            //input_itemsets[index-1] - penalty,
            //input_itemsets[index-max_cols] - penalty);

        end
   endgenerate

endmodule

这是我收到的警告和错误:

WARNING:HDLCompiler:413 - "/home/suriyha/Monajalal/needle_t1/needle.v" Line 39: Result of 4-bit expression is truncated to fit in 1-bit target.
ERROR:HDLCompiler:1401 - "/home/suriyha/Monajalal/needle_t1/needle.v" Line 39: Signal  index[3] in unit needle is connected to following multiple drivers:
Driver 0: output signal of instance Power (PWR_1_o_BUF_9).
Driver 1: output signal of instance Ground (GND_1_o_BUF_8).
Driver 2: output signal of instance Ground (GND_1_o_BUF_6).
Driver 3: output signal of instance Ground (GND_1_o_BUF_4).
Driver 4: output signal of instance Ground (GND_1_o_BUF_11).
Module needle remains a blackbox, due to errors in its contents
WARNING:HDLCompiler:1499 - "/home/suriyha/Monajalal/needle_t1/needle.v" Line 21: Empty module <needle> remains a black box.

然而,主要代码是“分配索引 = (idx + 1) * max_cols + (i + 1 - idx);” 但我决定将“索引”设为一个数组来避免这个问题,但是我还没有解决这个问题。所以无论 index 是一个数组还是一个变量,我都有这个多值问题。

代码的C版本也是:

for( idx = 0 ; idx <= i ; idx++){
    index = (idx + 1) * max_cols + (i + 1 - idx);
    input_itemsets[index]= maximum( input_itemsets[index-1-max_cols]+ referrence[index],
    input_itemsets[index-1] - penalty,
     input_itemsets[index-max_cols] - penalty);
 }

我还想知道我们是否可以有一个嵌套循环,就像我们在 Verilog 版本的 C 对应部分中所拥有的那样,或者在这种情况下如何避免“多驱动程序”问题?

谢谢。

4

3 回答 3

4

在您的 Verilog 代码中,大多数index位是双驱动(x)或非驱动(z)的常量: index[7:0]:zzzxxxx1

解释如下。外部循环是从 4 到 0,这意味着index[7:5]是 undriven( z)。内部循环是从 0 到i,展开如下:

assign index[4] = (0 + 1) * max_cols + (4 + 1 - 0);
assign index[4] = (1 + 1) * max_cols + (4 + 1 - 1);
...
assign index[1] = (0 + 1) * max_cols + (1 + 1 - 0);
assign index[1] = (1 + 1) * max_cols + (1 + 1 - 1);
assign index[0] = (0 + 1) * max_cols + (0 + 1 - 0);

index[4:1]双驱动()也是如此x,并且只有index[0]一个驱动程序。

在此处进行测试的编译代码:EDA Playground

于 2013-08-07T23:27:45.687 回答
2

output index[7:0]是一个未打包的位数组。与此等效的 C 是bool *index[8]. 相信你想要output [7:0] index

问题:

WARNING:HDLCompiler:413 - "/home/suriyha/Monajalal/needle_t1/needle.v" 第 39 行:4 位表达式的结果被截断以适合 1 位目标。

是指index[i] = (idx + 1) * max_cols + (i + 1 - idx);。只有左侧表达式的 lsb ob 将被分配给index[i](1 位值)。右侧的受让人值应至少为 4 位值。

错误:HDLCompiler:1401 -“/home/suriyha/Monajalal/needle_t1/needle.v”第 39 行:单元针中的信号索引 [3] 连接到以下多个驱动程序:[...]

此错误是由于您使用生成语句的方式造成的。如果你解开你的 for 循环,你会看到多个assign index[3] = .... 我建议用块替换 gerenatealways @(*)块。输出应该是output reg中间值,例如i并且idx应该是一种integer类型或某种形式的压缩reg(ex reg [7:0] i, idx;)。

其他突出的问题。

它看起来像是input_itemsets一个inout. Verilog 中的输入输出与 C 非常不同。在 Verilog 中,在任何给定时间都应该有一个驱动程序。冲突的驱动程序将导致 X。最好在驱动阶段制作带有样本状态和切换的副本。

您想要的可能类似于以下内容:

http://www.edaplayground.com/s/6/48

于 2013-08-08T00:09:21.817 回答
0

我使用生成语句只是为了在块之间建立连接,我看到你分配给 index[] idx 和 i,它们不是信号(这些没有驱动程序)......我的意思是这些值不会成为索引获取值。您应该在编写 verilog 代码时考虑这是否意味着硬件。我的意思是参数和 for 不是硬件中的东西如果要索引获取值,则必须使用具有驱动程序(输入,电线)的信号。

于 2013-08-07T23:26:03.360 回答