Потерять данные в verilog в случае расчета дисперсии? - PullRequest
0 голосов
/ 29 октября 2019

Я пытаюсь реализовать дисперсию в vivado 2017.4 с использованием арифметики с фиксированной точкой. Но до сих пор я заметил, что вивадо дает мне результат без какой-либо точки после десятичной точки, например. вместо того, чтобы давать 6.56, это дает 6. И в конце я получил огромную разницу в конечном результате, как вместо того, чтобы получить 7.20, ответ приходит как 6. В одном слове, мне нужно представление кода с фиксированной точкой иДля того, чтобы сделать это, какую модификацию мне нужно сделать. Информация о дисперсии находится по ссылке ниже. https://www.sciencebuddies.org/science-fair-projects/science-fair/variance-and-standard-deviation Код для расчета дисперсии, испытательного стенда и данных следующие:

 `timescale 1ns / 1ps   
/////////////////////////////////////////////////
module var_data(data_mean,data_sum,data_var);
parameter a=5;
reg signed [15:0] datatxt[0:4];
localparam sf = 2.0**-8.0;  //  scaling factor is 2^-4
integer i;
output reg signed  [15:0] data_var=16'b00000000_00000000;
output reg signed [15:0] data_sum=16'b00000000_00000000;
output reg signed [15:0] data_mean=16'b00000000_00000000;
reg signed [15:0] data_diff=16'b00000000_00000000;
reg signed [15:0] data_diff_sq=16'b00000000_00000000;
initial
begin
$readmemb("C:\\Users\\Ab\\Desktop\\abhi_veri\\value.txt",datatxt);
end
initial 
begin
for(i=0;i<5;i=i+1)
begin
data_sum = data_sum + datatxt[i];
end
end
initial
begin

data_mean = data_sum/a;
end

initial
begin
for(i=0;i<5;i=i+1)
begin
data_diff=(datatxt[i]*sf-data_mean*sf);
data_diff_sq = data_diff_sq + (data_diff*data_diff);

end
data_var = data_diff_sq/a;
end
endmodule

`timescale 1ns / 1ps
module var_data_tb();
wire [15:0] data_mean,data_sum,data_var;
var_data vd(data_mean,data_sum,data_var);
endmodule
///////////////////////data//////////////

0000000000000101
0000000000000010
0000000000000111
0000000000000100
0000000000001001

1 Ответ

0 голосов
/ 05 ноября 2019

Здесь есть несколько вопросов. Я знаком с SystemVerilog и никогда не работал с обычным Verilog, поэтому ваш пробег может отличаться, но я собираюсь использовать в основном основные вещи, которые должны присутствовать и в Verilog.

Первое, что вы объявиливсе как целое число, и это то, что вы получаете в средстве просмотра формы волны (поскольку нет никаких операторов $display(), я предполагаю, что именно здесь вы проверяете свои результаты).

Если вы используете запись с фиксированной точкой, котораяполностью на вас как на реализации (отслеживание того, где находится точка после умножения и деления и т. д.), так и на стороне визуализации. Вы можете преобразовать число с фиксированной запятой в представление с плавающей запятой, поддерживаемое средствами просмотра формы волны, объявив вещественную переменную в зависимости от вашего вектора с помощью my_real = $bitstoreal(my_vector) / 2**point_position.

Вторая проблема, которая, возможно, больше, заключается в том, что выобъявляют несколько начальных блоков для того, что я предполагаю, должны быть последовательными операциями. Поскольку Verilog используется главным образом для описания аппаратных средств, предполагается, что отдельные блоки являются отдельными вещами, а отдельные вещи ничего не знают друг о друге, если вы как-то не говорите им.

В вашем конкретном случае у вас есть вещь, которая читает файли помещает содержимое в память, вещь, которая суммирует содержимое памяти, вещь, которая делит сумму на число, и вещь, которая вычисляет дисперсию, исходя из содержимого памяти и среднего значения, которое вы вычислили. Поскольку все они стремятся выполнить свою работу как можно быстрее, для симулятора совершенно законно вычислить среднее значение пустой памяти, затем заполнить ее и затем вычислить дисперсию относительно неправильного среднего значения или любого другого порядка на самом деле.

Чтобы исправить это, нужно поместить все в один начальный блок, чтобы порядок был гарантирован.

Как примечание, все это не будет работать вне симулятора. Ваши вычисления могут работать на аппаратном уровне, но для их интерпретации с помощью цепочки инструментов потребуется совершенно другой стиль кодирования.

...