ViKo 1 25 марта, 2010 Опубликовано 25 марта, 2010 · Жалоба Господа, как то не ожидал от вас такого... И сами разработчики стандарта признали, что назвать тип переменной словом reg было большой ошибкой, потому то и заменили его в SV на тип logic. Ну, если сами разработчики... что ж от меня ожидать иного? :) С этим, надеюсь, всем стало понятно. Если я кого-то сбил с истины, приношу извинения. Что же касается очередности выполнения операторов, то пока что из переписки трудно что понять. Хотелось бы ясности. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Des333 0 25 марта, 2010 Опубликовано 25 марта, 2010 · Жалоба ... Это понятие языка программирования, коим является верилог. ... Ну это уже совсем не соответствует действительности. HDL - Hardware Description Language. Вычисление RHS - это не одна из частей nonblocking assignment, а один из этапов реализации присваивания, т.е. само по себе оно не является ни statement, ни его частью. Если A состоит из этапов A1 и A2, является ли A1 частью A? Мой ответ - да. Ваш, как я понял, нет. Вы в свою очередь, объясните, пожалуйста, как вы понимаете эти две страницы текста из раздела 11 с 11.1 по 11.5? Про очередь событий, активные события (и неопределенность их выборки из очереди). Вообще не нашел в стандарте таких пунктов. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SM 0 25 марта, 2010 Опубликовано 25 марта, 2010 · Жалоба Вообще не нашел в стандарте таких пунктов. Это в SV такие номера. В обсуждаемом V-2001 - они имеют номера 5.xx. Но написано там одно и то же. Если A состоит из этапов A1 и A2, является ли A1 частью A? Мой ответ - да. Ваш, как я понял, нет. Я тоже считаю, что если исполнение statement-а состоит из этапов 1..N то и каждый из этапов исполнения подчиняется "по наследству" правилу более высокого уровня исполнения statement-ов в целом. Соответственно, если из-за особенностей реализации какого-то этапа будет нарушено общее правило вычисления последовательности statement-ов - то это тоже нарушение стандарта. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Des333 0 25 марта, 2010 Опубликовано 25 марта, 2010 · Жалоба Что же касается очередности выполнения операторов, то пока что из переписки трудно что понять. Хотелось бы ясности. Мне кажется, в этом споре истине не суждено родиться. Нужно либо: 1) Привлечь большое число разработчиков к обсуждению. Возможно, понятнее от этого не станет, но лично мне было бы интересно узнать взгляд на этот вопрос des00 и CaPpuCcino. 2) Чтобы точно узнать истину - обратиться к разработчикам стандарта. Не знаю, правда, есть ли такая возможность в принципе. Просто писать по кругу одни и теже вещи мне уже надоело. :) UDP. Опечатачка :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SM 0 25 марта, 2010 Опубликовано 25 марта, 2010 · Жалоба 1) Привлечь большое число разработчиков к осуждению. во-во. Посадить (забанить) всех нафиг! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Des333 0 25 марта, 2010 Опубликовано 25 марта, 2010 · Жалоба Это в SV такие номера. В обсуждаемом V-2001 - они имеют номера 5.xx. Но написано там одно и то же.Ясно. Постоянно заставляют прыгать со стандарта на стандарт. :) dxp: Касательно очередей понимаю следубщим образом: если активные event'ы расположены либо в параллельном блоке, либо они описаны раздельно в разных блоках, то порядок выполнения не определен. Если они расположены в последовательном блоке, то будут выполняться в том порядке, в котором они расположены в исходном коде, как это и описывает параграф 9.8 во-во. Посадить (забанить) всех нафиг! Опечатачка вышла по Фрейду. :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Leka 0 25 марта, 2010 Опубликовано 25 марта, 2010 (изменено) · Жалоба Истина одна - в языке с однократным присваиванием д/б только неблокирующее присваивание. Кстати, если использовать только неблокирующие присваивания, проще переносить алгоритмы с ЯП на HDL и обратно. :bb-offtopic: Перевел подпрограмму(пока не программу целиком) N-ферзей с Паскаля на Верилог - записи похожие, проверю/отлажу - выложу. Сейчас задача у меня - выработать стиль написания на Паскале/Верилоге, чтобы легко м/б переносить алгоритмы в обе стороны. Синтез дает ~2K LUT, быстродействие сопоставимо с ~10ГГц x86. Изменено 25 марта, 2010 пользователем Leka Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
des00 25 25 марта, 2010 Опубликовано 25 марта, 2010 · Жалоба Возможно, понятнее от этого не станет, но лично мне было бы интересно узнать взгляд на этот вопрос des00 когда я курил стандарты на V/SV у меня сложилось трактование стандарта как у SM, поэтому не вижу смысла вмешиваться, правда иногда сложно удержаться %) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dxp 53 25 марта, 2010 Опубликовано 25 марта, 2010 · Жалоба Господа, как то не ожидал от вас такого. reg это тип переменной языка Verilog, никакого отношения к синтезу регистра не имеющий. А что, где-то было указано обратное? Если A состоит из этапов A1 и A2, является ли A1 частью A? Мой ответ - да. Ваш, как я понял, нет. Если запись значения в переменную (на каком-нибудь процессоре) порождает чтение операнда из памяти, то является ли это чтение частью записи? Мой ответ - нет, т.к. это побочный эффект операции. Побочный эффект - это сопутствующее действие, но это не часть причины, его порождающей. Надеюсь, аналогия ясна. Мне кажется, в этом споре истине не суждено родиться. Нужно либо: 1) Привлечь большое число разработчиков к обсуждению. Возможно, понятнее от этого не станет, но лично мне было бы интересно узнать взгляд на этот вопрос des00 и CaPpuCcino. 2) Чтобы точно узнать истину - обратиться к разработчикам стандарта. Не знаю, правда, есть ли такая возможность в принципе. Я написал письмо в комитет. Если ответят, я тут опубликую все результаты. Надеюсь, что ответят. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SM 0 25 марта, 2010 Опубликовано 25 марта, 2010 · Жалоба Если запись значения в переменную (на каком-нибудь процессоре) порождает чтение операнда из памяти, то является ли это чтение частью записи? Мой ответ - нет, т.к. это побочный эффект операции. А это IMHO некорректное сравнение. "Если update LHS порождает "evaluate RHS", то является ли "evaluate RHS" частью "update LHS"" ? Нет конечно. Однако - из чего состоит операция "пересылка" в CPU - из чтения и записи. И они в операции пересылки неотъемлемы. Также и в V - из чего состоит statement execution... Из чего на ваш взгляд состоит "statement execution"? На мой взгляд из двух неотъемлемых частей - вычисления RHS и апдейта LHS, и не одна из этих частей не является побочным эффектом операции исполнения statement-а, они обе неотъемлемы, без какой либо из них statement не исполнен, но с начала какой либо из них начинается и исполнение statement-а в целом. Поэтому и ни одна из этих частей не должна противоречить общим правилам для исполнения statement-ов. Т.е., если вдруг по каким-то причинам вычисление RHS (как часть общего statement execution) произойдет до полного окончания всех этапов исполнения предыдущего блокирующего присваивания - то я в этом усматриваю прямое нарушение 9.2.1., несмотря на то, что, допустим, оно не нарушает ни одного из 5.хх Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
des00 25 25 марта, 2010 Опубликовано 25 марта, 2010 · Жалоба А что, где-то было указано обратное? ваше сообщение №229 Понимать его следует просто: req - это регистр, который хранит значение между последовательными проходами процедурных блоков. Только и всего.....Это понятие языка программирования, коим является верилог. хотя конечно, если у вас собственная терминология, и под словом регистр вы понимали слово переменная, также как под словами язык программирования Verilog вы понимали слова язык описания аппаратуры Verilog тогда считайте что я вас не так понял. Я написал письмо в комитет. Если ответят, я тут опубликую все результаты. Надеюсь, что ответят. подождем, интересно кто же прав %) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Des333 0 25 марта, 2010 Опубликовано 25 марта, 2010 · Жалоба Если запись значения в переменную (на каком-нибудь процессоре) порождает чтение операнда из памяти, то является ли это чтение частью записи? Мой ответ - нет, т.к. это побочный эффект операции. Побочный эффект - это сопутствующее действие, но это не часть причины, его порождающей. Надеюсь, аналогия ясна. Только тут не "порождает", а "состоит". И если операция "запись" состоит из операции "чтение" и операции "собственно запись", то мой ответ - да, операция "чтение" часть операции "запись". Нелогичность и неблагозвучность названий операций этого не изменит. Я написал письмо в комитет. Если ответят, я тут опубликую все результаты. Надеюсь, что ответят. Если не секрет, не могли бы выложить текст письма? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 25 марта, 2010 Опубликовано 25 марта, 2010 (изменено) · Жалоба Не могу скопировать текст, приведу снимок экрана. Из стандарта IEEE1364-1995. В переводе: Регистр - абстракция для элемента хранения данных. Называется reg. Хранит значение от одного назначения до другого. Оператор назначения действует как триггер, который изменяет значение элемента хранения данных. Начальное значение - неопределено. Ни в какую полемику не втягиваю. Так пишу, по инерции. Изменено 25 марта, 2010 пользователем ViKo Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Des333 0 25 марта, 2010 Опубликовано 25 марта, 2010 · Жалоба Ни в какую полемику не втягиваю. Так пишу, по инерции. Ну-ну. :rolleyes: Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Leka 0 25 марта, 2010 Опубликовано 25 марта, 2010 · Жалоба N-ферзей: программа на Паскале: var acol, arow, aleft, aright : array[0..15] of integer; col, row, left, right, place, pos1, N1, N2 : integer; procedure queens( var count : longint; var pos : integer; N : integer; rst : integer ); begin begin // always@* begin place := not acol[pos] and (acol[pos] + 1); col := acol[pos] or place; row := arow[pos] or place; left := ( aleft[pos] or place ) shl 1; right := ( aright[pos] or place ) shr 1; pos1 := pos + 1; end; begin // always@( posedge clk ) if ( acol[pos] <> -1 ) then begin if ( pos = N ) then count := count + 1 else if ( pos = N1 ) and ( acol[pos] = N2 ) then count := count shl 1; end else if ( pos = 1 ) and ( N1 = 0 ) then count := count shl 1; if ( rst <> 0 ) then count := 0; end; begin // always@( posedge clk ) if ( acol[pos] <> -1 ) and ( pos <> N ) then begin acol[pos] := col; arow[pos1] := row; aleft[pos1] := left; aright[pos1] := right; acol[pos1] := row or left or right; pos := pos + 1; end else pos := pos - 1; if ( rst <> 0 ) then begin N1:= N and 1; N2 := not ( 1 shl ( N shr 1 ) ); acol[1] := -1 shl ( ( N + 1) shr 1 ); arow[1] := -1 shl N; aleft[1] := 0; aright[1] := 0; pos := 1; end; end; end; const table : array[1..17] of longint = ( 1, 0, 0, 2, 10, 4, 40, 92, 352, 724, 2680, 14200, 73712, 365596, 2279184, 14772512, 95815104 ); var count : longint; pos, N, rst : integer; begin N := 1; repeat write( 'N=', N : 2 ); rst := 1; queens(count, pos, N, rst); rst := 0; repeat queens(count, pos, N, rst); until ( pos = 0 ); if (count = table[N] ) then writeln( ' count=', count : 8, ' Ok') else writeln( ' count=', count : 8, ' error ', table[N] : 8); N := N + 1; until ( N = 16 ); end. и модуль на Верилоге, соответствующий процедуре queens() : module queens( output reg [31:0] count, output reg [15:0] pos, input [15:0] N, input rst, clk ); reg [15:0] acol[15:0], arow[15:0], aleft[15:0], aright[15:0]; reg [15:0] col, row, left, right, place, pos1, N1, N2; always@* begin place <= ~acol[pos] & (acol[pos] + 1); col <= acol[pos] | place; row <= arow[pos] | place; left <= ( aleft[pos] | place ) << 1; right <= ( aright[pos] | place ) >> 1; pos1 <= pos + 1; end always @( posedge clk ) begin if ( acol[pos] != -1 ) begin if ( pos == N ) count <= count + 1; else if ( ( pos == N1 ) && ( acol[pos] == N2 ) ) count <= count << 1; end else if ( ( pos == 1 ) && ( N1 == 0 ) ) count <= count << 1; if ( rst != 0 ) count <= 0; end always @( posedge clk ) begin if ( ( acol[pos] != -1 ) && ( pos != N ) ) begin acol[pos] <= col; arow[pos1] <= row; aleft[pos1] <= left; aright[pos1] <= right; acol[pos1] <= row | left | right; pos <= pos + 1; end else pos <= pos - 1; if ( rst != 0 ) begin N1<= N & 1; if ( N == 1 ) N1 <= -1; N2 <= ~( 1 << ( N >> 1 ) ); acol[1] <= -1 << ( ( N + 1) >> 1 ); arow[1] <= -1 << N; aleft[1] <= 0; aright[1] <= 0; pos <= 1; end end endmodule В Icarus Verilog симуляция проходит нормально, дает правильные ответы. В ISE синтез дает ~~1К ЛУТ для N < 16, симуляция зависает. Оисания на ЯП и HDL похожи, вот и напрашивается препроцессор, и единый стиль для программы и устройства. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться