Compiler errors 信号连接到以下多个驱动器

Compiler errors 信号连接到以下多个驱动器,compiler-errors,verilog,xilinx,hdl,Compiler Errors,Verilog,Xilinx,Hdl,我正在尝试运行以下操作,但收到此错误: 以下是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

我正在尝试运行以下操作,但收到此错误:

以下是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
模块指针(输入参考、输入惩罚、输出索引[7:0]);
//输入/输出项目集;
//输入参考;
//输入惩罚;
//产出指数;
参数max_cols=8;
//
导线指数[7:0];
电汇参考;
电汇罚款;
//线输入_项集;
genvari,idx;
生成
对于(i=max_cols-4;i>=0;i=i-1)

对于(idx=0;idx我使用generate语句只是为了在块之间建立连接,我看到您正在分配索引[]idx和I,它们不是信号(它们没有驱动程序)…我的意思是,这些值不会成为获取值的索引。在编写verilog代码时,您应该考虑这是否意味着硬件中的某些内容。我的意思是参数和for不是硬件中的某些内容
如果您希望索引获取值,则必须使用具有驱动器(输入、导线)的信号。

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

解释如下。外循环是从4到0,这意味着
索引[7:5]
未被驱动(
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]
有一个驱动程序


这里有一个测试的编译代码:

输出索引[7:0]
是一个未打包的位数组。与此等价的C是
bool*索引[8]
。我相信您需要
输出[7:0]索引

这些问题:

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

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

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

此错误是由于您使用generate语句的方式造成的。如果您解开for循环,您将看到多个
赋值索引[3]=…
。我建议将gerenate块替换为
始终@(*)
块。输出应为
Output reg
,中间值如
i
idx
应为
整数类型或压缩
reg
的某种形式(例如
reg[7:0]i,idx;

其他突出的问题。

看起来,
input\u itemsets
应该是一个
inout
。Verilog中的inout与C非常不同。在Verilog中,在任何给定时间都应该有一个驱动程序。驱动程序冲突将导致X。最好在驱动阶段复制示例状态并进行交接

您想要的可能如下所示:

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);

尝试使用输入为索引分配某些内容。非idx/iI希望转换此C
index=(idx+1)*max_cols+(i+1-idx)
编程到HDL级别。这不是我想从头开始写的东西,但显然我们不能通过assign语句将循环索引分配给变量,对吗?是的,如果你想要一个可合成的代码,你不能。但是如果它不可合成,你可以。我只是想一想你会遇到的错误,因为你正在尝试t他输出一个变量,这个信号不会改变(即在1和0之间),这就是为什么信号总是连接到VCC或GND的原因。我之所以使用数组作为索引,是因为当我单独使用“index”变量时,我收到了“multiple driver”所以我想如果我使用一个数组,它可能会解决这个问题。然而,我使用genvar并生成的原因是整数是不可合成的,这就是我使用“genvar”的原因对于i和j。在这种情况下,您建议如何进行可合成设计?如果您的合成器不够聪明,无法优化出用作for循环索引的
整数,那么请改为执行类似
reg signed[7:0]
的操作。请查看EDA网站、my和others答案中的链接。
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);