Перейти к содержанию
    

Этот безусловный always должен всем понравится потому что нужен для того чтобы назначить reg значение ибо assign test_out=0 для reg не верно

ну а смысл того always в том что я хочу выкинуть выход test_out и всю логику подключенную к нему независимо от сброса

и смысла в сбросе не вижу для это выхода.

Проверил в Active HDL: с собачкой always блок вообще не выполняется, значение не присваивается, без собачки даёт предупреждение на бесконечный цикл, и действительно молотит бесконечный цикл с нулевой дельтой.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А зачем там always блок? Там initial нужен. А синтез сам все выкинет и без блока вообще.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Проверил в Active HDL: с собачкой always блок вообще не выполняется, значение не присваивается, без собачки даёт предупреждение на бесконечный цикл, и действительно молотит бесконечный цикл с нулевой дельтой.

я не считаю этот как бе симулятом за симулятор :biggrin:

проверял в симплифае всё делает как надо

вот попробуйте так

module test
#(parameter
    TEST_ON0=0,
    TEST_ON1=0
)
(
    input clk, reset,
    input valid_in,
    input[31:0]data_in,
    output reg[31:0] data_out,
    output reg data_val,
    output [31:0]test_out
);

    reg[31:0]test_out_r;
    
    always@(posedge clk or posedge reset)
    if(reset)
    begin
       data_out<=0;
       data_val<=0;
    end
    else
    begin
        data_out<=(valid_in)?data_in:data_out;
        data_val<=valid_in;
    end
    
    generate
    if(TEST_ON0==1 && TEST_ON1==0)begin:TEST_ON0_GEN
        reg[31:0] testt;
        always@(posedge clk or posedge reset)
        if(reset)
        begin
           testt<=0;
           test_out_r<=0;
        end
        else
        begin
            testt<=(valid_in)?testt+1:testt;
            test_out_r<=(valid_in)?testt:test_out_r;
        end
    end
    endgenerate
    
    generate
    if(TEST_ON1==1 && TEST_ON0==0)begin:TEST_ON1_GEN
        reg[63:0] testt;
        always@(posedge clk or posedge reset)
        if(reset)
        begin
           testt<=64'd0;
           test_out_r<=0;
        end
        else
        begin
            testt<=(valid_in && data_in==2)?testt+1:testt;
            test_out_r<=(valid_in)?testt[63:32]:test_out_r;
        end
    end
    endgenerate    
    assign test_out=(TEST_ON0==TEST_ON1)?0:test_out_r;
endmodule

 

А зачем там always блок? Там initial нужен. А синтез сам все выкинет и без блока вообще.

это если синтез понимает initial, то да так тоже можно

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

я не считаю этот как бе симулятом за симулятор :biggrin:

проверял в симплифае всё делает как надо

вот попробуйте так

В этом случае при синтезе возможен варнинг о неиспользованном и неприсвоенном значении test_out_r.

 

Вот на VHDL можно просто использовать continuous assigment на test_out, а как 100% правильно и переносимо сделать это на verilog, пока не понятно. Хотя нет, понятно: надо test_out_r декларировать только внутри generate, когда test_out используется, и в отдельном generate писать assign test_out = 1'b0;, когда test_out не используется.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

это если синтез понимает initial, то да так тоже можно

 

Синтезу не нужно ничего понимать в initial-ах. Синтез поголовно все регистры (порты, и т.п.), которым ничего и нигде не присвоено, просто выкинет, а если они где-то используются (а в данном примере они не должны использоваться, так как об этом вся ветка, что делать с неиспользуемым портом), то заводит их на GND. А initial только для симулятора, чтобы не было отличия от синтеза.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Синтезу не нужно ничего понимать в initial-ах. Синтез поголовно все регистры (порты, и т.п.), которым ничего и нигде не присвоено, просто выкинет, а если они где-то используются (а в данном примере они не должны использоваться, так как об этом вся ветка, что делать с неиспользуемым портом), то заводит их на GND. А initial только для симулятора, чтобы не было отличия от синтеза.

вот что было у ТС

большую часть сигналов и настроек сделал через parameter, и модуль меняется. А сейчас появилось желание избавиться от части функционала, прям от нескольких входов - выходов, и блока их обработки. Оставить выход в воздухе - варнинг что выход не подключен, плюс часть функционала не оптимизируется и есть ресурсы.

спсб за разьяснения про initial, оно мне как бе не надо

это пусть ТС мучается :rolleyes:

 

В этом случае при синтезе возможен варнинг о неиспользованном и неприсвоенном значении test_out_r.

 

Вот на VHDL можно просто использовать continuous assigment на test_out, а как 100% правильно и переносимо сделать это на verilog, пока не понятно. Хотя нет, понятно: надо test_out_r декларировать только внутри generate, когда test_out используется, и в отдельном generate писать assign test_out = 1'b0;, когда test_out не используется.

в первом исходнике что я дал нет никаких варнингов и синтезируется как надо.

про VHDL не было речи, так что давайте без "а вот на VHDL..." :biggrin:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вот на VHDL можно просто использовать continuous assigment на test_out,

 

На верилог тоже можно и легко. assign test_out=0, но при этом его объявление как reg надо убрать внутрь условного блока, чтобы оно не включалось в компиляцию, когда не надо.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

ну то есть получается что внутри блока все хорошо, а вот прям модуль изменить (выкинуть порты, чтобы их вообще не было даже объявлено) можно только через ifdef, и тут мы (а вернее я, все остальные на нормальных средах) имеем легкое не понимание со стороны среды. Вот же блин! Ну да ладно, я не гордый, я закомментировал:). Не забыть бы раскомментировать потом все блоки, в одну то сторону оно легче идет:)...

 

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

синтаксисом, хотелось бы сохранить все таки верилог верилогом, но в целом да, можно дописать только первые перевод # в `

#define <- `define

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

но в целом да, можно дописать только первые перевод # в `

 

Это тоже написали уже давно, стандартной утилитой sed делается одним движением левого мизинца.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

ну а где тогда место подвигу?

Сменить среду разработки, которая поймет все дефайны сама (и заодно семейство ПЛИС) :) - вот это подвиг!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

разделение труда убережет меня от этого:)... максимум среду, но не думаю что для ксалинкса есть какая-то другая среда, которая без бубнов заработает разом.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

что для ксалинкса есть какая-то другая среда, которая без бубнов заработает разом.

 

Есть варианты. Можно, например, все делать в synplify, а ise только для place-route вызывать из него...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

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

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...