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

как быстро вникнуть в чужой код

Да знаю я ответ. Устроил соревнование electronix vs ixbt - где раньше правильный ответ дадут.

 

 

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


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

ну тогда вот такая правочка

reg State = 0;
always @(posedge clk)
  begin
     if((((d1&d2&d3) == 1'b1)&&(State == 0))
       begin
         q<=~q;
         State <= 0; 
       end
     else
         State <= 1'b1;

которая учитывает единственное отличие while от forever

while по стандарту должен иметь внутри хоть один клок, по этому клоку проверяется условия, и пока они верны все выполняется.

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


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

Нет. Выкладываю тестбенч, d1 d2 d3 все вместе нигде не перекрываются, но q должен меняться (при правильной работе модуля tst).

module tb();
reg clk = 0; always #5 clk<=~clk;
wire q;
reg d1=0, d2=0, d3=0;
initial begin
    #100 
        d1=1;
    #100
        d2=1;    
    #100 
        d1=0;
        d3=1;
    #100 
        d3=0;
    #100 
        d3=1;        
    #100 
        d2=0;
    #100 
        d3=0;
    #100 
        d3=1;
    #100 
        d3=0;
end

tst t(q, d1, d2, d3, clk);
always@(posedge clk) 
    $strobe("  %1d%1d%1d  %1d", d1, d2, d3, q);
initial #1000 $finish;
endmodule

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


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

Думаю, подходящая ветка.

module tst(
    output reg q=0,
    input d1, d2, d3, clk 

);
    always
        while(d1)
            while(d2)
                while(d3)
                    @(posedge clk)
                        q <= ~q;    
endmodule

Просьба:

1) объяснить работу этого модуля с точки зрения стандарта Верилога,

2) привести в моделируемый вид,

3) перевести в синтезируемый (для ПЛИС) вид.

Тут, помимо q, извращённым способом определены ещё 3 триггера, назову их d1t,d2t,d3t(у каждого выход .q), условия установки/сброса следующие:

d3t.reset = ~d3 && posedge clk

d3t.set = d2t.q && d3

d2t.reset = ~d2 && ~d3.q

d2t.set = d1.q && d2

d1t.reset = ~d1 && ~ d2.q

d1t.set = d1

Сплошная асинхронщина, в некоторых ПЛИС нет RS триггеров, придётся на LE слепить:).

Хотя, это можно как то и упростить, наверное, но думать лень, задача дурацкая.

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


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

играем на том что условие проверяется 1 раз в начале цикла? и потому если мы провалились в первые 2 вайла, то можно изменить одновременно d3 и d1, и мы все равно провалимся в 3 while?

 

 

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

verilog 2001 ref guide, там про while написано вот что

 

while loop must take one clock cycle for each loop cycle (i.e: an @(posedge clk) or @(negedge clk) must be within loop)

 

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

 

 

Из этих 2 утверждений я делаю выводы что все-таки это не полная асинхронщина, и как минимум по ref guide 2001 выполнения этой конструкции будет привязано к клоку. И думаю единственное что тут есть, это игра на том что условие проверяется в начале каждого цикла....

 

 

 

но сдается мне что это очень сильно зависит от реализации интерпритатора языка. И уверен что будут среды которые пошлют такую конструкцию, будут среду которые будут выполнять ее каждый клок всю и только если все d в 1, а будут среды которые будут проваливаться в один вайл и утыкаться в другой, пока что-то не поменяется...

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


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

Тут, помимо q, извращённым способом определены ещё 3 триггера, назову их d1t,d2t,d3t(у каждого выход .q),
Да.

условия установки/сброса следующие:

d3t.reset = ~d3 && posedge clk

d3t.set = d2t.q && d3

d2t.reset = ~d2 && ~d3.q

d2t.set = d1.q && d2

d1t.reset = ~d1 && ~ d2.q

d1t.set = d1

С условиями сброса не согласен.

Сплошная асинхронщина
d1 d2 d3 могут быть регистровыми выходами другого модуля, и тогда дизайн в целом синхронный.

Кстати, есть ли в Верилоге возможность объявить входы синхронными за счет _внешних_ регистров?

задача дурацкая

Вне "синтеза программ" - да.

Изменено пользователем Leka

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


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

Да.

С условиями сброса не согласен.

d1 d2 d3 могут быть регистровыми выходами другого модуля, и тогда дизайн в целом синхронный.

Да, если d1,d2,d3 регистровые выходы, синхронные с clk, то весь дизайн переходит к синхронному, и условия установки/сброса можно упростить, однако в условиях задачи этого не было:).

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


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

а после того как задача сведется к синхронной она не выродиться в смену q по фронту клока, когда все сигналы в 1?

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


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

Условие while проверяется "изнутри" - не как условие входа в цикл, а как инверсное условие выхода.

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


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

прикольно... а это в стандарте описано или где-то в толкованиях?

 

просто в том же ref guide 2001 это как-то явно не указано, хотя есть ремарка что оно "завязано" на клок внутри, и что условие проверяется в начале каждой итерации. Это как то немного меня смущает...

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


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

Зафиксирован отказ от продолжения боя со стороны iXBT.

Общий счет "electronix vs iXBT" - 2:0 в пользу electronix.

 

Мой вариант ответов к задачке ( пункты 2),3) ):

//--------------------------------------------
module tb();
reg clk = 0; always #5 clk<=~clk;
wire q1, q2; reg d1=0, d2=0, d3=0;
initial begin
    #100
        d1=1;
    #100
        d2=1;    
    #100 
        d1=0;
        d3=1;
    #100 
        d3=0;
    #100
        d3=1;        
    #100 
        d2=0;
    #100 
        d3=0;
    #100 
        d3=1;
    #100 
        d3=0;
end
tst1 t1(q1, d1, d2, d3, clk);
tst2 t2(q2, d1, d2, d3, clk);
always@(posedge clk) 
    $strobe("  %1d%1d%1d  %1d%1d", d1, d2, d3, q1, q2);
initial #1000 $finish;
endmodule
//--------------------------------------------
module tst1(
    output reg q=0,
    input d1, d2, d3, clk 
);
    always
        #1 while(d1)
            #1 while(d2)
                 #1 while(d3)
                    @(posedge clk) 
                        q <= ~q;
endmodule
//--------------------------------------------
module tst2(
    output reg q=0,
    input d1, d2, d3, clk 
);
    wire e1 = d1;
    wire e2 = (e2 | e1) & d2;
    wire e3 = (e3 | e2) & d3;
    
    always@(posedge clk) 
        if(e3) q <= ~q;
        
endmodule
//--------------------------------------------

 

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


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

на IXBT оказались дизайнеры лучше. Они видать работали и им некогда было глупостями маятся:)...

 

вопрос о том где описано поведение while остается открытым...

 

как-то уж очень чуднО выходит.

 

как только d1 становится 1, мы проваливаемся в while и сидим там пока оно не станет 0, это ок.

как только к d1 добавляется d2, мы проваливаемся во второй while и сидим там, даже если первый while перестал выполняться, то есть даже когда d1 стало обратно 0.

И также с 3 while, и как только мы провалились в него q начинает молотить... и теперь даже если убрать d1 и d2 ничего не остановится...

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


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

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

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

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

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

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

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

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

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

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