2016-08-31 13 views
-1

これはプロセッサの実行ブロックです。ほとんどのコードは参考のためにのみ含まれています。Verilogエラー:Xst:528:マルチソース信号。この信号は複数のドライバに接続されています

module Execution_Block(A, B, data_in, op_dec, flag_ex, ans_ex, data_out, 
       mem_en_dec, mem_rw_dec, mem_mux_sel_dec, RW_dec, clk, reset, 
       B_Bypass, mem_en_ex, mem_rw_ex, mem_mux_sel_ex, RW_ex); 

     //INPUTS 
     input [7:0] A, B, data_in; 
     input clk, reset, mem_en_dec, mem_rw_dec, mem_mux_sel_dec; 
     input [4:0] RW_dec; 
     input [4:0] op_dec; 

     //OUTPUTS 
     output [3:0] flag_ex; 
     output reg mem_en_ex, mem_rw_ex, mem_mux_sel_ex; 
     output reg [7:0] B_Bypass, ans_ex, data_out; 
     output reg [4:0] RW_ex; 

     //WIRES 
     wire [7:0] ans_temp, data_out_buff; 
     wire [7:0] W0, W1,W2, W3, W4, W5, W6, W7, W8, W9, W10, W11, W12,        W13, W14, W15, W16, W17, W18, W19, W20, 
     W21, W22, W23, W24, W25, W26, W27, W28; 
     wire P; 
     wire [3:0]flag_temp; 
     wire [3:0]flag_hold_prev; 

     //ALU 
     assign W0 = (op_dec == 5'b00000) ? (A+B)  : W1;  //ADD 
     assign W1 = (op_dec == 5'b00001) ? (A+(~B+1)) : W2;  //SUB 
     assign W2 = (op_dec == 5'b00010) ? (B)   : W3;  //MOV 
     assign W3 = (op_dec == 5'b00100) ? (A&B)  : W4;  //AND 
     assign W4 = (op_dec == 5'b00101) ? (A|B)   : W5;  //OR 
     assign W5 = (op_dec == 5'b00110) ? (A^B)  : W6;  //XOR 
     assign W6 = (op_dec == 5'b00111) ? (~B)  : W7;  //NOR 
     assign W7 = (op_dec == 5'b01000) ? (A+B)  : W8;  //ADI 
     assign W8 = (op_dec == 5'b01001) ? (A+(~B+1)) : W9;  //SBI 
     assign W9 = (op_dec == 5'b01010) ? (B)   : W10; //NVI 
     assign W10 = (op_dec == 5'b01100) ? (A&B)  : W11; //ANI 
     assign W11 = (op_dec == 5'b01101) ? (A|B)  : W12; //ORI 
     assign W12 = (op_dec == 5'b01110) ? (A^B)  : W13; //XRI 
     assign W13 = (op_dec == 5'b01111) ? (~B)  : W14; //NTI 
     assign W14 = (op_dec == 5'b10000) ? (ans_temp) : W15; //RET 
     assign W15 = (op_dec == 5'b10001) ? (ans_temp) : W16; //HLT 
     assign W16 = (op_dec == 5'b10100) ? (A)   : W17; //LD 
     assign W17 = (op_dec == 5'b10101) ? (A)   : W18; //ST 
     assign W18 = (op_dec == 5'b10110) ? (data_in) : W19; //IN 
     assign W19 = (op_dec == 5'b00111) ? (ans_temp) : W20; //OUT 
     assign W20 = (op_dec == 5'b11000) ? (ans_temp) : W21; //JMP 
     assign W21 = (op_dec == 5'b11001) ? (A<<B)  : W22; //LS 
     assign W22 = (op_dec == 5'b11011) ? (A>>B)  : W23; //RS 
     assign W23 = (op_dec == 5'b11011) ? 
       ((A[2:0]==3'b000) ? B : 
       ((A[2:0]==3'b001) ? {B[7], B[7:1]} : 
       ((A[2:0]==3'b010) ? {B[7], B[7], B[7:2]} : 
       ((A[2:0]==3'b011) ? {B[7], B[7], B[7], B[7:3]} : 
       ((A[2:0]==3'b100) ? {B[7], B[7], B[7], B[7], B[7:4]} : 
       ((A[2:0]==3'b101) ? {B[7], B[7], B[7], B[7], B[7], B[7:5]} : 
       ((A[2:0]==3'b110) ? {B[7], B[7], B[7], B[7], B[7], B[7], B[7:6]} : 
       ((A[2:0]==3'b111) ? {B[7], B[7], B[7], B[7], B[7], B[7], B[7], B[7]}: 0)))))))) : W24; //RSA 

     assign W24 = (op_dec == 5'b11100) ? (ans_temp) : W25;   //JC 
     assign W25 = (op_dec == 5'b11101) ? (ans_temp) : W26;  //JNC 
     assign W26 = (op_dec == 5'b11110) ? (ans_temp) : W27;   //JZ 
     assign W27 = (op_dec == 5'b11111) ? (ans_temp) : W28;  //JNZ 
     assign W28 = 8'b00000000; 

     //ANSWER TEMP 
     assign ans_temp = ((op_dec == 5'b00000) ? W0 :    //ADD 
        ((op_dec == 5'b00001) ? W1 :     //SUB 
        ((op_dec == 5'b00010) ? W2 :     //MOV 
        ((op_dec == 5'b00100) ? W3 :     //AND 
        ((op_dec == 5'b00101) ? W4 :     //OR 
        ((op_dec == 5'b00110) ? W5 :     //XOR 
        ((op_dec == 5'b00111) ? W6 :     //NOT 
        ((op_dec == 5'b01000) ? W7 :     //ADI 
        ((op_dec == 5'b01001) ? W8 :     //SBI 
        ((op_dec == 5'b01010) ? W9 :     //MVI 
        ((op_dec == 5'b01100) ? W10 :     //ANI 
        ((op_dec == 5'b01101) ? W11 :     //ORI 
        ((op_dec == 5'b01110) ? W12 :     //XRI 
        ((op_dec == 5'b01111) ? W13 :     //NTI 
        ((op_dec == 5'b10000) ? W14 :     //RET 
        ((op_dec == 5'b10001) ? W15 :     //HLT 
        ((op_dec == 5'b10100) ? W16 :     //LD 
        ((op_dec == 5'b10101) ? W17 :     //ST 
        ((op_dec == 5'b10110) ? W18 :     //IN 
        ((op_dec == 5'b10111) ? W19 :     //OUT 
        ((op_dec == 5'b11000) ? W20 :     //JMP 
        ((op_dec == 5'b11001) ? W21 :     //LS 
        ((op_dec == 5'b11010) ? W22 :     //RS 
        ((op_dec == 5'b11011) ? W23 :     //RSA 
        ((op_dec == 5'b11100) ? W24 :     //JC 
        ((op_dec == 5'b11101) ? W25 :     //JNC 
        ((op_dec == 5'b11110) ? W26 :     //JZ 
        ((op_dec == 5'b11111) ? W27 : W28))))))))))))))))))))))))))));    //JNZ 

    //FLAGS 
    //CARRY FLAG      
    assign flag_temp[0] = (A[7]&B[7])|| (A[6]&B[6])|| (A[5]&B[5])|| (A[4]&B[4])|| 
         (A[3]&B[3])|| (A[2]&B[2])|| (A[1]&B[1])|| (A[0]&B[0]); 

    //ZERO FLAG 
    assign flag_temp[1] = (ans_temp)? 1 : 0; 

    //OVERFLOW FLAG 
    assign flag_temp[2] = (A[7]&B[7])^(A[6]&B[6]); 

//PARITY FLAG 
//PARITY GENERATOR 
assign P = ans_temp[7]^ans_temp[6]^ans_temp[5]^ans_temp[4]^
      ans_temp[3]^ans_temp[2]^ans_temp[1]^ans_temp[0]; 

//PARITY CHECKER    
assign flag_temp[3] = ans_temp[7]^ans_temp[6]^ans_temp[5]^ans_temp[4]^
         ans_temp[3]^ans_temp[2]^ans_temp[1]^ans_temp[0]^P; 

There is an error of Xst:528 - Multi-source in Unit (Execution_Block) on signal (flag_ex) this signal is connected to multiple drivers.

//ALL FLAGS AFFECTED: flag_temp[3:0]   
//PARITY AND ZERO AFFECTED, RESET OTHER FLAGS: {flag_temp[3], 1'b0, flag_temp[1], 1'b0}  
//RESET ALL FLAGS: 4'b0000   
//HOLD PREVIOUS FLAG: flag_hold_prev  


assign flag_temp= ((op_dec == 5'b00000) ? flag_temp[3:0] :   //ADD 
        ((op_dec == 5'b00001) ? flag_temp[3:0] :  //SUB 
        ((op_dec == 5'b00010) ? {flag_temp[3], 1'b0, flag_temp[1], 1'b0} :       //MOV 
        ((op_dec == 5'b00100) ? {flag_temp[3], 1'b0, flag_temp[1], 1'b0} :       //AND 
        ((op_dec == 5'b00101) ? {flag_temp[3], 1'b0, flag_temp[1], 1'b0} :       //OR 
        ((op_dec == 5'b00110) ? {flag_temp[3], 1'b0, flag_temp[1], 1'b0} :       //XOR 
        ((op_dec == 5'b00111) ? {flag_temp[3], 1'b0, flag_temp[1], 1'b0} :       //NOT 
        ((op_dec == 5'b01000) ? flag_temp[3:0] :       //ADI 
        ((op_dec == 5'b01001) ? flag_temp[3:0] :       //SBI 
        ((op_dec == 5'b01010) ? {flag_temp[3], 1'b0, flag_temp[1], 1'b0} :       //MVI 
        ((op_dec == 5'b01100) ? {flag_temp[3], 1'b0, flag_temp[1], 1'b0} :      //ANI 
        ((op_dec == 5'b01101) ? {flag_temp[3], 1'b0, flag_temp[1], 1'b0} :      //ORI 
        ((op_dec == 5'b01110) ? {flag_temp[3], 1'b0, flag_temp[1], 1'b0} :      //XRI 
        ((op_dec == 5'b01111) ? {flag_temp[3], 1'b0, flag_temp[1], 1'b0} :      //NTI 
        ((op_dec == 5'b10000) ? 4'b0000 :      //RET 
        ((op_dec == 5'b10001) ? 4'b0000 :      //HLT 
        ((op_dec == 5'b10100) ? flag_hold_prev :      //LD 
        ((op_dec == 5'b10101) ? flag_hold_prev :      //ST 
        ((op_dec == 5'b10110) ? {flag_temp[3], 1'b0, flag_temp[1], 1'b0} :      //IN 
        ((op_dec == 5'b10111) ? flag_hold_prev :      //OUT 
        ((op_dec == 5'b11000) ? flag_hold_prev :      //JMP 
        ((op_dec == 5'b11001) ? {flag_temp[3], 1'b0, flag_temp[1], 1'b0} :      //LS 
        ((op_dec == 5'b11010) ? {flag_temp[3], 1'b0, flag_temp[1], 1'b0} :      //RS 
        ((op_dec == 5'b11011) ? {flag_temp[3], 1'b0, flag_temp[1], 1'b0} :      //RSA 
        ((op_dec == 5'b11100) ? flag_hold_prev :      //JC 
        ((op_dec == 5'b11101) ? flag_hold_prev :      //JNC 
        ((op_dec == 5'b11110) ? flag_hold_prev :      //JZ 
        ((op_dec == 5'b11111) ? flag_hold_prev : W28))))))))))))))))))))))))))));    //JNZ 

assign flag_ex = flag_temp; 
assign flag_hold_prev = flag_ex; 

Even though flag_ex is assigned only once.

assign data_out_buff = (op_dec == 5'b10111) ? A : W28; 

//REGISTER 
[email protected](posedge clk) 
begin 
if(reset == 1'b1)        //RESET SIGNAL IS ON 
    begin 
      ans_ex <= 8'b00000000; 
      data_out <= 8'b00000000; 
      mem_en_ex <= 1'b0; 
      mem_rw_ex <= 1'b0; 
      mem_mux_sel_ex <= 1'b0; 
      RW_ex <= 5'b00000; 
      B_Bypass <= 8'b00000000; 
    end 
else            //RESET SIGNAL IS OFF 
    begin 
      ans_ex <= ans_temp; 
      data_out <= data_out_buff; 
      mem_en_ex <= mem_en_dec; 
      mem_rw_ex <= mem_rw_dec; 
      mem_mux_sel_ex <= mem_mux_sel_dec; 
      RW_ex <= RW_dec; 
      B_Bypass <= B; 
    end 
    end 
    endmodule 

答えて

0

flag_tempは、2つの別個の割り当てステートメントに割り当てられています。いったん個々のビットが割り当てられ、次回はバス全体に割り当てられます。これにより、シンセサイザーに問題が発生します。

おそらく、このエラーが表示されているのは、flag_tempに複数のドライバがあり、それがflag_exに割り当てられているためです。

//FLAGS 
    //CARRY FLAG 
    assign flag_temp[0] = (A[7]&B[7])|| (A[6]&B[6])|| (A[5]&B[5])|| (A[4]&B[4])|| 
         (A[3]&B[3])|| (A[2]&B[2])|| (A[1]&B[1])|| (A[0]&B[0]); 

    //ZERO FLAG 
    assign flag_temp[1] = (ans_temp)? 1 : 0; 

    //OVERFLOW FLAG 
    assign flag_temp[2] = (A[7]&B[7])^(A[6]&B[6]); 

//PARITY FLAG 
//PARITY GENERATOR 
assign P = ans_temp[7]^ans_temp[6]^ans_temp[5]^ans_temp[4]^
      ans_temp[3]^ans_temp[2]^ans_temp[1]^ans_temp[0]; 

//PARITY CHECKER 
assign flag_temp[3] = ans_temp[7]^ans_temp[6]^ans_temp[5]^ans_temp[4]^
         ans_temp[3]^ans_temp[2]^ans_temp[1]^ans_temp[0]^P; 

2nsインスタンス。

assign flag_temp= ((op_dec == 5'b00000) ? fl .... 
+0

ありがとうございます。私は代入flag_texp =((op_dec == 5'b00000)?fl .... assign_flag_ex =((op_dec == 5'b00000)?fl ....)これはコードのエラーを解決しましたが、今度は波形ares_ex、flag_exは正しくプロポゲートしません。 – peregriuns19

+0

assign flag_ex =((op_dec == and removed // assign flag_ex = flag_temp; ans_exとflag_exはリセット後に正しく動作しません。期待される行動であり、現在の行動は何ですか? –

関連する問題