2016-04-01 23 views
0

İki kayan nokta sayısını çarpacak bir Verilog kodu yazmaya çalışıyorum. iki mantissaya çarparak ve değiştirerek çarpmaya çalışmak, sorunlara dönüştüğüm yer. Sorun şu ki, "shift ve add" değişkenini, C_m_tmp değiştirmeye çalıştığımda, hiçbir şey olmuyor (C_m_tmp = C_m_tmp + tmp;). Sorunumla ilgili olmayan herhangi bir kod bloğunu ihmal ettim. Birisi bana yanlış gideceğimi söyleyebilir mi?ek döngü için çalışmayan verilog

`timescale 1ns/1ps 
module float_mult(A_m, B_m, C_m); 
    input [22:0]A_m, B_m; 
    output [45:0]C_m; 

    reg [45:0] C_m_tmp; 
    reg [22:0] A_m_tmp; 
    reg [22:0] B_m_tmp; 
    reg [45:0] tmp; 
    reg [4:0]i; 

    initial begin   
     assign C_m_tmp = 46'b0; 
    end 
//need to remove the leading one from mantissas 
[email protected] (A_m) begin 
    A_m_tmp = A_m >> 1; 
    A_m_tmp = A_m_tmp^23'b10000000000000000000000; 
end 
[email protected] (B_m) begin 
    B_m_tmp = B_m >> 1; 
    B_m_tmp = B_m_tmp^23'b10000000000000000000000; 
end 
[email protected](A_m_tmp, B_m_tmp) begin 
    for (i=0; i <=22; i=i+1) 
     if (B_m_tmp[i] == 1)begin 
      tmp = {23'b0,A_m_tmp}; 
      tmp = tmp <<i; 
      C_m_tmp = C_m_tmp + tmp; //this line does nothing 
     end 
end 
    [email protected](C_m_tmp)begin 
     if (C_m_tmp[45] == 1) begin 
      C_e_tmp = C_e_tmp + 1'b1; 
     end 

    end 


    assign C_e = C_e_tmp + 8'b01111111; 
    assign C_m = C_m_tmp[45:23]; 
    assign C_s = C_s_tmp;   

endmodule 
+0

ilk blok – Greg

+0

Kullanım dahilinde' assign' kurtulun yapabilirsiniz. – sharvil111

cevap

0
initial begin   
assign C_m_tmp = 46'b0; 
end 

Yukarıdaki kod gerek yoktur.

Bunun yerine, `daima @ *` veya `always_comb` yerine manuel hassasiyet listesi

[email protected](C_m_tmp)begin 
C_m_tmp = 'b0; 
     if (C_m_tmp[45] == 1) begin 
      C_e_tmp = C_e_tmp + 1'b1; 
     end 

    end 
+0

C_m_tmp'i farklı bir satırda başlatmam gerekiyordu, ancak kodu bozan başlangıç ​​bloğu OLDU. Çok teşekkür ederim. – willieG