Jump to content

    

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

а когда поймете че будет:)?

 

отгадку потом не забудьте сообщить...

Share this post


Link to post
Share on other sites

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

 

 

Share this post


Link to post
Share on other sites

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

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 по стандарту должен иметь внутри хоть один клок, по этому клоку проверяется условия, и пока они верны все выполняется.

Share this post


Link to post
Share on other sites

Нет. Выкладываю тестбенч, 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

Share this post


Link to post
Share on other sites
Думаю, подходящая ветка.

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 слепить:).

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

Share this post


Link to post
Share on other sites

играем на том что условие проверяется 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, а будут среды которые будут проваливаться в один вайл и утыкаться в другой, пока что-то не поменяется...

Share this post


Link to post
Share on other sites
Тут, помимо 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 могут быть регистровыми выходами другого модуля, и тогда дизайн в целом синхронный.

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

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

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

Edited by Leka

Share this post


Link to post
Share on other sites
Да.

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

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

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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

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

 

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

Share this post


Link to post
Share on other sites

Зафиксирован отказ от продолжения боя со стороны 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
//--------------------------------------------

 

Share this post


Link to post
Share on other sites

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

 

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

 

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

 

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

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

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

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this