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

Профессия RTL Designer не имеет будущего?

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

В самом начале дискуссии я как раз проводил аналогию с VHDL переменными %) Рад что вы разобрались %)

 

ЗЫ. Все таки, что-то академическое в VHDL есть, жаль что загнули неплохой в общем то язык %)

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


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

По сути такой код эквивалентен:

always @* begin
  temp1 = .....;
  temp2 = ....;
  temp3 = f(temp1);
  if (sel)
     temp4 = temp3;
  else
     temp4 = temp2;
end

always @(posedge clk) 
    real_out <= temp4;

Эта схема безопасна априори. Вам не нравится, я помню.

 

Не совсем эквивалентна и не совсем безопасна. Допустим у нас в момент времени X активны и событие вычисления begin...end-а "*" первого always и posedge clk второго always. В таком случае в моем коде на неопределенность не попадем, а в Вашем - попадем. Если заранее гарантировано, что оба события не могут активизироваться в одно и тоже время - да, безопасен. Но в общем случае небезопасен (для симуляции, для синтеза вообще этой неопределенности нет из-за гарантируемого параллелизма, зато там метастабильность).

 

Это только потому, что пока нет распространенных и доступных синтезаторов с языков более высокого уровня, чем HDL.

А UML Вы считаете ниже уровнем, чем HDL? (MAxilica)

 

Вот представьте, что вы пишете код типа:

....

Разве создание такого синтезатора - не достойная цель? Имхо, очень достойная.

Bluespec, если я понимаю, именно и есть этот путь. А синопсис видимо этот путь признал неудачным, раз прикрыл Synopsys BC (behavioral compiler)

 

 

, что захочу, то и поставлю. Так ведь я именно об этом и говорил! Опять все наизнанку вывернуто.

Вот именно, "что захочу, то и поставлю". Но если задаться целью не применять блокирующие присваивания, то и о циклах придется забыть. Потому как если там применить неблокирующие, то он просто не будет работать. Это то, о чем говорил я.

 

разве я могу присвоить что-то i внутри цикла?

Сколько угодно. Тем более, что тот же верилог исполняет его, разворачивая во while. Ну по крайней мере гарантируя эквивалентность конструкций стандартом.

 

 

UPD: про безопасность конструкций. Под ней я сейчас подразумеваю то, чтобы тестбенч выполнялся с одинаковым результатом на любом симуляторе, несмотря на любые реальные гонки (даже два одновременно возникнувших евента "*" и "posedge clk"). Т.е. чтобы не возникало такого, что у меня так, у фирмы-компаньона эдак, и неделю возни, чтобы понять, почему. Хотя сам еще не попадался на такое, хоть и использовал не раз результаты блокирующих присваиваний вне блока. Но потенциальная возможность таки есть.

 

Тогда получается, что:

 

A blocking procedural assignment statement shall be executed before the execution of the statements that follow it in a sequential block.

 

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

 

Избыточная лучше, чем недостающая. Лишний раз об этом напомнишь - меньше писем с вопросами на эту тему получишь... :biggrin:

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


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

Синтезируемое описание последовательных алгоритмов - задачка интересная, но и граблей хватает :smile3046: . Не сразу понял, например, почему у меня код вылетает из цикла "while ( 1 )" при "en1 == en2 == ... enN == 0":

while( 1 )
  while ( en1 )
  ...
  endwhile
  while ( en2 )
  ...
  endwhile
  ...  
  while ( enN )
  ...
  endwhile
endwhile

"while ( 0 ) ... endwhile" выполняется за 0 тактов, поэтому код сводится к логически противоречивому "while ( 1 ) endwhile". А так интересно получается - "мгновенный" (те за 0 тактов) переход из любого внутреннего цикла в любой другой. Например, из "while ( en2 )" в "while ( en1 )" при "en3 == ... enN == 0". И тд и тп.

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

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


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

Синтезируемое описание последовательных алгоритмов - задачка интересная, но и граблей хватает :smile3046:

 

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

 

Кстати еще есть синтезируемое словечко "disable", помогающее в таких случаях с while(1)

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


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

Речь о синтезе последовательных алгоритмов, описанных в стиле ЯП, а не HDL (тема то - синтез из ЯП). В моем примере "while" - оператор не Верилога, а императивного ЯП (" `while" в Верилоге). Поясню на таком примере:

http://ru.wikipedia.org/wiki/%D0%90%D0%B2%...%BD%D0%B8%D0%B5

Программа на Си:

{
    int c;
    do {
        c = getchar();
        while(c == ' ')
            c = getchar();
        while(c != EOF && c != ' ' && c != '\n') {
            putchar(c);
            c = getchar();
        }
        putchar('\n');
        while(c != EOF && c != '\n')
            c = getchar();
    } while(c != EOF);

и соответствующее синтезируемое устройство(1 символ/такт), описанное в стиле императивного ЯП (" `s " - последовательное выполнение, задержка на такт):

module tst(
  output reg [7:0] q,
  output reg put=0, // разрешение putchar(q)
  output reg get=1, // разрешение getchar(c)
  input [7:0] c,
  input clk
);
`always@(posedge clk) 
`begin     
  `while( c != EOF )         
    `while( c == ' ' )        
      `s;
    `endwhile  
    `while( c != EOF && c != ' ' && c != '\n' )
      `s begin q <= c; put <= 1; end 
    `endwhile    
    `s begin q <= '\n'; put <= 1; get <= 0; end
    `s begin put <= 0; get <= 1; end
    `while( c != EOF && c != '\n' )
      `s;   
    `endwhile   
  `endwhile  
  `s get <= 0;
`end
endmodule

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

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


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

Судя по дискуссии, это профессия SW Designer не имеет будущего, а RTL Designer - это незыблемо и вечно! :beer:

 

Есть не согласные? :laughing:

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


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

Когда синтез для FPGA будет осуществляться на FPGA-системах, за доли секунды - тогда и будет полная и окончательная победа HW Designer.

 

Но не RTL Designer.

 

Кстати, пример (из wiki) синтезируется в ~40 ЛУТ в ISE 9.2 и в Квартусе 9.1, а в ISE 11.2 зависает... (этот конкретный пример в tb() не проверял, проверял похожие).

 

( ' надо заменить на " и тд)

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


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

На всякий случай написал tb() - подправил неточности.

ISE 11.2 зависает, подожду 12.1 .

ISE 9.2 синтезирует в ~30 ЛУТ, ~160МГц, симулирует (все O'k):

123;

abc;

;

Код без "`define":

`timescale 1ns/1ns
module tb();
wire [7:0] q;
wire [7:0] c;
wire p, g;
reg clk = 1;
reg [4:0] i = 24;
wire [25*8-1:0] str = {"  123  456 \n", "abc 789\n", "   \n", 8'h0}; 
assign c = str[i*8 +: 8]; 
tst _(q, p, g, c, clk);
always  #1 clk <= ~clk;
always @( posedge clk ) if ( g ) i <= i-1; 
always @( posedge clk ) if ( p ) $write( "%c", q);
always @( posedge clk ) if ( c == 0 ) #10 $finish;
initial #100 $finish;
endmodule

module tst(
  output reg [7:0] q,
  output reg put=0,
  output reg get=1,
  input [7:0] c,
  input clk
);
`always@(posedge clk) 
`begin     
    `while( c != 0 )    
  
        `while( c == " " )        
            `s;
        `endwhile  

        `while( c != 0 && c != " " && c != "\n" )
            `s q <= c; 
            `p put <= 1; 
        `endwhile    

        `while( c != 0 && c != "\n" )
            `s put <= 0;   
        `endwhile   

        `s q <= ";";  
        `p put <= 1;  
        `p get <= 0; 

        `s q <= "\n"; 
         
        `s put <= 0; 
        `p get <= 1;   
    
    `endwhile  
    `s get <= 0;
`end
endmodule

И что, имеет смысл описывать подобное (интерфейсы, управление, ...) в стиле FSM на "чистом" HDL ?

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

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


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

Между прочим, в каталоге с установленным Quartus имеется папочка systemc, с кучей файлов (только почему-то одни *.h - заголовки, что ли? или нет, это, кажется и есть файлы проектов, такое у них расширение!)

Так что, может быть SystemC уже где-то совсем недалеко?

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


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

(тема то - синтез из ЯП).

 

Вообще тема - синтез из описаний высокого уровня, и не хотелось бы, чтобы это было с ЯП. Т.е. мне не хотелось. Мне как-то UML тот же интереснее.

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


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

Вообще тема - синтез из описаний высокого уровня, и не хотелось бы, чтобы это было с ЯП.

Того-же мнения, что императивные ЯП малопригодны для высокоуровневого синтеза "железа". С функциональными ЯП дела не имел. Пока что экспериментирую с `while(), `if(), и тп - чтобы почувствовать нюансы смешанного стиля...

 

Мне как-то UML тот же интереснее.

Графический ввод, что-ли? Неинтересно, имхо.

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


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

Графический ввод, что-ли?

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

 

Вообще на сегодня сложновато что-то более высокоуровневое, чем UML, найти.

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


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

Глючный ISE не понимает вложенные `define (Квартус понимает), для преобразования можно использовать препроцессор ivlpp.exe из IcarusVerilog - делает все подстановки `define с аргументами.

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


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

"Компилятор" на `define :

32-разрядное деление на Си:

int q, r, n, d, i, r1, ge;
q31() { return (q >> 31) & 1; }
wire() { 
    r1 = r << 1 | q31(); 
    ge = r1 >= d; 
}
div32() {
    for( q = n, i = 31, r =1; q31() == 0; q = q << 1, i = i-1 );     
    for( q = q << 1; i > 0; wire(), r = ge ? r1-d : r1, q = (q << 1) | ge, i = i-1 );
}

и на синтезируемом Верилоге, 1 такт/разряд (32 разряда - 33 такта), ~150 ЛУТ:

module div32(
    output reg [31:0] q, r, 
    input [31:0] n, d,
    input clk
);
reg  [4:0] i;   
wire [31:0] r1 = r << 1 | q[31];
wire ge = r1 >= d;
`always@(posedge clk) `begin  
    `for( q <= n; i <= 31; r <=1;, q[31] == 0, q <= q << 1; i <= i-1; )   
    `for( q <= q << 1;, i > 0, r <= ge ? r1-d : r1; q <= (q << 1) | ge; i <= i-1; )    
`end
endmodule

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


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

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

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

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

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

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

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

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

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

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