Verilog错误:分配向量索引的分配(维度错误)

时间:2016-08-18 13:14:50

标签: syntax-error verilog

 assign flag_temp[3:0]  = ((op_dec == 5'b00000) ? flag_temp[3:0] : 
//ADD
 ((op_dec == 5'b00001) ? flag_temp[3:0] :                            
//SUB
((op_dec == 5'b00010) ? flag_temp[1], flag_temp[3], flag_temp[0] = 1'b0, flag_temp[2] = 1'b0 :  
//MOV    
Status bits :- flag_ex[0] = carry; flag_ex[1] = zero;
flag_ex[2] = overflow; flag_ex[3] = parity;

我必须重置进位和溢出标志,但它显示语法和尺寸错误。

1 个答案:

答案 0 :(得分:0)

代码中的一些语法可以修复。您可以通过{}运算符对一组信号进行分组。

 wire [3:0] flag_temp;
 assign flag_temp [3:0]  = (op_dec == 5'b00000) ? flag_temp[3:0] :
                (op_dec == 5'b00001) ? flag_temp[3:0] :
                (op_dec == 5'b00010) ? {flag_temp[1], flag_temp[3], flag_temp[0]} : {flag_temp[2]} ;

有无与伦比的牙套。两个开口((但只有一个关闭)。 在赋值语句中还有赋值,flag_temp [0] = 1' b0,它胜过赋值本身的目的。 此外,还为flag_temp分配了自己,没有为其分配外部值。这将导致flag_temp保持" x"总是。

代码的意图对我来说不是很清楚,所以无法提出更有意义的建议。

更新代码 - 下面是一些示例代码,它执行一些基于数据模型的操作。其余的操作符可以添加到类似的行上。

对于现在针对特定操作进行更改的信号,将循环返回值,并且对于更改特定标志的操作将添加到串联" {}"运营商。 最后是保留原始值的默认值。

reg  [3:0] x ;
reg  [3:0] y;
wire  [3:0] sum;
wire carry_i = 1 ; // driven to 1 for example 
wire zero ;
assign {carr_o,sum} = x+y+carry_i ;

assign flag_ex[3:0] =  (op_dec == 5'b00000) ? { flag_ex[3],flag_ex[2],flag_ex[1],carr_o} : // ADD
                         (op_dec == 5'b00001) ? { flag_ex[3],flag_ex[2],flag_ex[1],carr_o}: // SUB
                         (op_dec == 5'b00010) ? { flag_ex[3],flag_ex[2],zero,flag_ex[0]}:  // MOV
                        flag_ex[3:0]; //default