des00 25 28 марта, 2010 Опубликовано 28 марта, 2010 · Жалоба Отсюда окончательный вывод, к которому вы сами пришли: блокирующие присваивания в регистровых блоках безопасно использовать только для присваивания значений переменным, используемым внутри этого блока - по сути локальным переменным. В самом начале дискуссии я как раз проводил аналогию с VHDL переменными %) Рад что вы разобрались %) ЗЫ. Все таки, что-то академическое в VHDL есть, жаль что загнули неплохой в общем то язык %) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SM 0 28 марта, 2010 Опубликовано 28 марта, 2010 · Жалоба По сути такой код эквивалентен: 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. избыточная инфа - ведь все выражения в последовательном блоке и так всегда выполняются последовательно. :) Избыточная лучше, чем недостающая. Лишний раз об этом напомнишь - меньше писем с вопросами на эту тему получишь... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Leka 0 1 апреля, 2010 Опубликовано 1 апреля, 2010 · Жалоба Опишите в стиле FSM: while( en1 ) while( en2 ) while( en3 ) begin ... end Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Leka 0 5 апреля, 2010 Опубликовано 5 апреля, 2010 (изменено) · Жалоба Синтезируемое описание последовательных алгоритмов - задачка интересная, но и граблей хватает :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". И тд и тп. Изменено 5 апреля, 2010 пользователем Leka Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SM 0 6 апреля, 2010 Опубликовано 6 апреля, 2010 · Жалоба Синтезируемое описание последовательных алгоритмов - задачка интересная, но и граблей хватает :smile3046: Никаких граблей на самом деле нет. Надо просто в уме понимать, что цикл должен быть разворачиваемый в однозначную нециклическую конструкцию. И представлять его в развернутом виде, и все. Кстати еще есть синтезируемое словечко "disable", помогающее в таких случаях с while(1) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Leka 0 6 апреля, 2010 Опубликовано 6 апреля, 2010 (изменено) · Жалоба Речь о синтезе последовательных алгоритмов, описанных в стиле ЯП, а не 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 Изменено 6 апреля, 2010 пользователем Leka Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Sefo 0 6 апреля, 2010 Опубликовано 6 апреля, 2010 · Жалоба Судя по дискуссии, это профессия SW Designer не имеет будущего, а RTL Designer - это незыблемо и вечно! :beer: Есть не согласные? :laughing: Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Leka 0 6 апреля, 2010 Опубликовано 6 апреля, 2010 · Жалоба Когда синтез для FPGA будет осуществляться на FPGA-системах, за доли секунды - тогда и будет полная и окончательная победа HW Designer. Но не RTL Designer. Кстати, пример (из wiki) синтезируется в ~40 ЛУТ в ISE 9.2 и в Квартусе 9.1, а в ISE 11.2 зависает... (этот конкретный пример в tb() не проверял, проверял похожие). ( ' надо заменить на " и тд) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Leka 0 6 апреля, 2010 Опубликовано 6 апреля, 2010 (изменено) · Жалоба На всякий случай написал 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 ? Изменено 6 апреля, 2010 пользователем Leka Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 6 апреля, 2010 Опубликовано 6 апреля, 2010 · Жалоба Между прочим, в каталоге с установленным Quartus имеется папочка systemc, с кучей файлов (только почему-то одни *.h - заголовки, что ли? или нет, это, кажется и есть файлы проектов, такое у них расширение!) Так что, может быть SystemC уже где-то совсем недалеко? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SM 0 7 апреля, 2010 Опубликовано 7 апреля, 2010 · Жалоба (тема то - синтез из ЯП). Вообще тема - синтез из описаний высокого уровня, и не хотелось бы, чтобы это было с ЯП. Т.е. мне не хотелось. Мне как-то UML тот же интереснее. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Leka 0 8 апреля, 2010 Опубликовано 8 апреля, 2010 · Жалоба Вообще тема - синтез из описаний высокого уровня, и не хотелось бы, чтобы это было с ЯП. Того-же мнения, что императивные ЯП малопригодны для высокоуровневого синтеза "железа". С функциональными ЯП дела не имел. Пока что экспериментирую с `while(), `if(), и тп - чтобы почувствовать нюансы смешанного стиля... Мне как-то UML тот же интереснее. Графический ввод, что-ли? Неинтересно, имхо. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SM 0 8 апреля, 2010 Опубликовано 8 апреля, 2010 · Жалоба Графический ввод, что-ли? Не графический ввод, а функциональное описание как класс. Т.е. не внешний вид описания важен, а суть - именно функциональный подход. в UML это просто интуитивно понятно и есть реальные средства синтеза, которыми можно пользоваться под любую технологию (плис, асик, и т.д.), а так можно взять тот же хаскель например. Вообще на сегодня сложновато что-то более высокоуровневое, чем UML, найти. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Leka 0 11 апреля, 2010 Опубликовано 11 апреля, 2010 · Жалоба Глючный ISE не понимает вложенные `define (Квартус понимает), для преобразования можно использовать препроцессор ivlpp.exe из IcarusVerilog - делает все подстановки `define с аргументами. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Leka 0 12 апреля, 2010 Опубликовано 12 апреля, 2010 · Жалоба "Компилятор" на `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 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться