2016-08-18 8 views
-2
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; 

キャリーとオーバーフローのフラグをリセットする必要がありますが、構文と寸法誤差があります。Verilog Error:別のベクトルインデックスへの代入(寸法誤差)

答えて

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]} ; 

中カッコがありません。 2つの開口部((しかし、1つの閉鎖のみ) assign文にflag_temp [0] = 1'b0という割り当てがあり、それは割り当て自体の目的に打ち勝つ。 また、flag_temp自体が割り当てられているため、 。それに割り当てられたこれは、残りのflag_tempになります

意思コードはそうより意味のある提案をすることができない私には非常に明確ではありません


更新されたコードは常に「×」 - 。。 以下は、データモデルベースの演算を行うサンプルコードです。残りの演算子は、同様の行に追加することができます。

特定の操作で変更される信号については、値はループバックされ、変更される操作では、特定のフラグが連結「{}」演算子に追加されます。 lastは、元の値が保持されるデフォルトです。

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 
+0

プロセッサ用のコードで、フラグ(キャリー、オーバーフロー、ゼロ、パリティ)を追加しており、データフローモデリングを使用することが義務付けられています。この意図は、パリティおよびゼロが(例えば)AおよびB動作の影響を受ける間、キャリーおよびオーバーフローフラグをリセットすることである。 – peregriuns19

+0

単純なデータフローモデリングの例を使用するようにコードを更新 –