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;
我必须重置进位和溢出标志,但它显示语法和尺寸错误。
答案 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