2015-03-08 9 views
0

Я хочу получить 16-битные данные для умножения с плавающей запятой, но resutls был неправильным, а не тем, что я требовал. Кстати, реальный должен быть в 64-битном?Умножение чисел с плавающей запятой в verilog

module calc(input [15:0]a, b, 
      output [15:0]o); 

assign o = a * b; 

endmodule 

вот испытательный стенд:

module calc_tb(); 

real a,b,o; 

calc U1 (.a(a),.b(b),.o(o)); 
initial begin 
a <= 2.2; 
b <= 2.5; 
#2; 
a <= -4.8; 
b <= 2.9; 
#2; 
end 
endmodule 
+0

Какие 16 бит вы хотите? Вы начинаете, как отметил @Morgan, с естественно 64-битными данными. Существует множество различных функций, которые отображают от 64 бит до 16 бит, поэтому вам нужно указать, что вы хотите. –

ответ

0

При запуске этого вы должны получать предупреждения по линии:

Port size (16 or 16) does not match connection size (64) 
    for port 'a'. The port definition is at: calc.sv(2). 

Для a, b и o, как вы определил их как 16 бит, а реалы - 64 бита.

Простое изменение порта на 64 бит заставит Verilog считать вашу передачу 64-битным целым числом. Вам необходимо сделать порты типа real:

module calc(
    input real a, 
    input real b, 
    output real o 
); 

assign o = a * b; 

endmodule 

Обратите внимание, что это невозможно. Синтезируемый Verilog не может обрабатывать плавающие точки из коробки. Вам необходимо реализовать или импортировать ядро ​​с плавающей запятой.

+0

Любая идея по замене 64-контактного разъема на 16-контактный? А также как реализовать или импортировать ядро ​​с плавающей запятой? Я сделал несколько исследований, но все еще не очень понимаю, как это работает, чтобы загрузить ядро ​​на modelsim. – Jack93

+0

@ Jack93 Что случилось с реальным/почему 16 бит? Что вы хотите, чтобы 16 бит были? Вам нужна дробная, а не плавающая точка? – Morgan

+0

Извините, что @Morgan, думаю, я смешиваю его с арифметикой с фиксированной точкой, которая требует только 16 бит. Я хотел бы, чтобы данные были в 16 бит. Как я могу это сделать? – Jack93