Nano Hash - криптовалюты, майнинг, программирование

Полная сумма сумматора отключена на один тактовый цикл

Я тестирую функциональность 8-битного сумматора Ripple Carry Adder с помощью тестового стенда, который пробует каждую комбинацию. По какой-то причине сумма текущих значений A и B вычисляется в следующем такте. Я не уверен, почему это происходит. Изначально я предполагал, что это из-за задержек, но ошибка все равно возникает, когда я меняю задержки. Вот мой код:

//one_adder.v

module One_adder(a,b,cin,sum,carry);
    output carry,sum;
    input a,b,cin;
    wire w0,w1,w2;

        xor(sum,a,b,cin);
        and(w0,a,b);
        and(w1,a,cin);
        and(w2,cin,b);
        or(carry,w0,w1,w2);

endmodule;


//Eight_adder.v

module Eight_adder(A,B,S,Carry);
    output [7:0]S, Carry;
    input [7:0]A, B;
    //wire [7:0]w;
    wire overflow;

    One_adder add0(.carry(Carry[0]), .sum(S[0]), .a(A[0]), .b(B[0]), .cin(Carry[0]));
    One_adder add1(.carry(Carry[1]), .sum(S[1]), .a(A[1]), .b(B[1]), .cin(Carry[1]));
    One_adder add2(.carry(Carry[2]), .sum(S[2]), .a(A[2]), .b(B[2]), .cin(Carry[2]));
    One_adder add3(.carry(Carry[3]), .sum(S[3]), .a(A[3]), .b(B[3]), .cin(Carry[3]));
    One_adder add4(.carry(Carry[4]), .sum(S[4]), .a(A[4]), .b(B[4]), .cin(Carry[4]));
    One_adder add5(.carry(Carry[5]), .sum(S[5]), .a(A[5]), .b(B[5]), .cin(Carry[5]));
    One_adder add6(.carry(Carry[6]), .sum(S[6]), .a(A[6]), .b(B[6]), .cin(Carry[6]));
    One_adder add7(.carry(Carry[7]), .sum(S[7]), .a(A[7]), .b(B[7]), .cin(Carry[7]));
    assign overflow= (A[7]&B[7]&~Carry[7]) | (~A[7]&~B[7]&Carry[7]);

endmodule


//tBench.v
//`timescale 1 ns/ 1 ns

module tBench;
    wire [7:0]sum;
    wire cin, co;
    reg[7:0] A, B;      // the different combinations
//module Eight_adder(A,B,Cin,S,Cout);
Eight_adder FA(A,B,sum,co);

initial begin
    for(A =0; A<255; A=A+1)
    begin
        #10 // the period in ModelSim: 10ns
        for(B=0; B<255; B=B+1)
        begin
          $display("A=%b,, B=%b,, Sum=%b,,", A,B,{co,sum});
         #10
            if({co,sum} != (A+B))
                $display("Error: A=%b b=%b sum=%b cout=%b\n", A, B, sum, co);
        end
    end
    $finish;
end
endmodule

Вот пример вывода:

введите здесь описание изображения


  • Почему вы проходите весь этап своей FA? Почему вы используете одно и то же значение переноса для cin и cout? Почему вы делаете и and(w1,b,cin);, и and(w2,cin,b);? 11.04.2016
  • @wilcroft 1Q), Не знаю, зачем я это делаю. 2Q) Потому что перенос становится переносом для всех однобитных сумматоров, когда я последовательно делаю 8-битный сумматор. 3Q) Это должно было быть and(w1,a,cin); и `and(w2,b,cin);' я редактировал код 11.04.2016
  • Смотрите ответ Грега на то, что я задавал в № 2. 11.04.2016

Ответы:


1

Вы вычисляете сумму в правильном цикле, но отображаете ее в другое время. Переместите $display в $monitor следующим образом:

initial begin
    $monitor("A=%b,, B=%b,, Sum=%b,,", A,B,{co,sum});
    for(A =0; A<255; A=A+1)
    begin
        #10 // the period in ModelSim: 10ns
        for(B=0; B<255; B=B+1)
        begin
         #10
            if({co,sum} != (A+B))
                $display("Error: A=%b b=%b sum=%b cout=%b\n", A, B, sum, co);
        end
    end
    $finish;
end
11.04.2016

2

Я удивлен, что вы не получаете только X для вывода суммы. У вас есть обратная связь по биту переноса обратно на перенос того же сумматора. Должно быть смещение, чтобы перенос одного сумматора был переносом другого сумматора.

One_adder add0(.carry(Carry[0]), .sum(S[0]), .a(A[0]), .b(B[0]), .cin(1'b0));
...
One_adder add7(.carry(carryout), .sum(S[7]), .a(A[7]), .b(B[7]), .cin(Carry[7]));

Что касается вашего отображаемого сообщения, ваше {co,sum} обновляется с той же отметкой времени, что и A и B. Планировщик Verilog оценивает $display, прежде чем появится возможность что-либо вычислить. Вы можете добавить задержку перед $display (как вы сделали с проверкой ошибок), заменить $display на $strobe или использовать $monitor перед циклом. (Возможно, вы захотите прочитать дисплей против стробоскопа против монитора в verilog?)

11.04.2016
Новые материалы

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

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

Частный метод Python: улучшение инкапсуляции и безопасности
Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

Как я автоматизирую тестирование с помощью Jest
Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

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

Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..