LINUX.ORG.RU

Схема умножения на фиксированный многочлен на Verilog

 , , ,


0

2

Хочу реализовать быстрый умножитель на константный многочлен из книги. Вот схема

[url=https://ibb.co/nsBVgpX][img]https://i.ibb.co/27SLnJz/1.png[/img][/url]

По этой схеме я написал такой код на верилоге:

[code] module multiplier( input logic clk, input logic reset, input logic in, output logic out );

reg [2:0] s;

always @(posedge clk)
    if (reset)
        s <= '0;
    else begin
        s[2] <= in;
        s[1] <= s[2];
        s[0] <= s[1];
    end
    
assign out = in ^ s[2] ^ s[0];

endmodule [/code]

И тестбенч к нему:

[code] module multiplier_tb();

logic clk;
logic reset;
logic in;
logic out;

initial begin
    clk = 0;
    forever #5 clk = ~clk;
end

multiplier m(clk, reset, in, out);

initial begin
    #1 reset = 1; #10
    reset = 0;

/*
// data 11111 in = 1; #10 in = 1; #10 in = 1; #10 in = 1; #10 in = 1; #10 // tail in = 0; #10 in = 0; #10 in = 0; #10 $stop; */

   // data 1000
   in = 0; #10
   in = 1; #10
   in = 0; #10
   in = 0; #10
   in = 0; #10
   // tail
   in = 0; #10
   in = 0; #10
   in = 0; #10
   $stop;
end

always @(posedge clk)
    #2 $write(out);

endmodule [/code]

Но на последовательности f(x) = 1000 схема работает неправильно. По математический расчетам должно получиться 1101000 - результат умножения многочлена g(x) = x^3 + x^2 + 1 на x^3. В логе симулятора получается такое: x00010000$stop Тут непонятно откуда появился икс, а последовательность бит вообще другая какая-то. Скажите, пожалуйста, как правильно реализовать эту схему и симулировать ее, чтобы получился верный результат.

В логе симулятора получается такое: x00010000$stop Тут непонятно откуда появился икс, а последовательность бит вообще другая какая-то

Икс означает неинициализированный бит или тот, который унаследовал неинициализированное состояние

Причина: скорее просто разрядности где то не хватило, вылезло за пределы. Что если объявить не reg [2:0] s; а например reg [7:0] s;

I-Love-Microsoft ★★★★★
()
Ответ на: комментарий от Aoizora

Странно, такие вещи смотрят потактово, начиная с какого момента появится икс. После tail не обязательно менять значения, всё что не меняется - остается без изменений во времени

Дело в том что write выдает симолы пошагово, и они появляются слева направо

Надо добавить in = 0; перед #1 reset = 1; #10, то есть задать все значения в самом начале работы симулятора, а уже потом делать сброс

I-Love-Microsoft ★★★★★
()
Ответ на: комментарий от Aoizora

Если не срочно, в субботу будет время, может в пятницу вечером, попробую прогнать у себя, пока вот работой очень занят не могу

А пока может еще кто то подскажет

I-Love-Microsoft ★★★★★
()
Последнее исправление: I-Love-Microsoft (всего исправлений: 1)
Ответ на: комментарий от akk

На плис сообществ почти нет. Полно сообществ у УГ типа веб дизайна, потому что какие-то бизнесюки придумывают очередные оригинальные идеи очередной формы с кнопашками. А на плис разработчиков меньше и не у кого учиться.

Aoizora
() автор топика
Ответ на: комментарий от Aoizora

А на плис разработчиков меньше и не у кого учиться

Я не понимаю. Вот же ваша тема на Электрониксе: https://electronix.ru/forum/index.php?app=forums&module=forums&controller=topic&id=170625 Вас там что-то не устроило? Это самый что ни на есть профессиональный форум. Плисоводов, в частности. Вас там что-то не устроило? Тут основная тематика Линукс, плисы очень постольку-поскольку.

akk ★★★★★
()
Последнее исправление: akk (всего исправлений: 2)
Ответ на: комментарий от Aoizora

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

repeat(3) @(posedge clk);

Это и есть синхронный дизайн.

Верилог, конечно, корявый язык. Сочинить такой синтаксис можно, только находясь под воздействием запрещённых веществ. Начинать лучше c VHDL, он не даст вам отстрелить себе ногу.

akk ★★★★★
()
Последнее исправление: akk (всего исправлений: 1)