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

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

Господа, как то не ожидал от вас такого... И сами разработчики стандарта признали, что назвать тип переменной словом reg было большой ошибкой, потому то и заменили его в SV на тип logic.

Ну, если сами разработчики... что ж от меня ожидать иного? :) С этим, надеюсь, всем стало понятно. Если я кого-то сбил с истины, приношу извинения.

Что же касается очередности выполнения операторов, то пока что из переписки трудно что понять. Хотелось бы ясности.

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


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

...

 

Это понятие языка программирования, коим является верилог.

 

...

Ну это уже совсем не соответствует действительности.

HDL - Hardware Description Language.

 

Вычисление RHS - это не одна из частей nonblocking assignment, а один из этапов реализации присваивания, т.е. само по себе оно не является ни statement, ни его частью.

Если A состоит из этапов A1 и A2, является ли A1 частью A? Мой ответ - да. Ваш, как я понял, нет.

 

Вы в свою очередь, объясните, пожалуйста, как вы понимаете эти две страницы текста из раздела 11 с 11.1 по 11.5? Про очередь событий, активные события (и неопределенность их выборки из очереди).

Вообще не нашел в стандарте таких пунктов.

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


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

Вообще не нашел в стандарте таких пунктов.

Это в SV такие номера. В обсуждаемом V-2001 - они имеют номера 5.xx. Но написано там одно и то же.

 

Если A состоит из этапов A1 и A2, является ли A1 частью A? Мой ответ - да. Ваш, как я понял, нет.

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

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


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

Что же касается очередности выполнения операторов, то пока что из переписки трудно что понять. Хотелось бы ясности.

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

 

 

Нужно либо:

 

  1) Привлечь большое число разработчиков к обсуждению. Возможно, понятнее от этого не станет, но лично мне было бы интересно узнать взгляд на этот вопрос des00 и CaPpuCcino.

 

  2)  Чтобы точно узнать истину - обратиться к разработчикам стандарта. Не знаю, правда, есть ли такая возможность в принципе.

 

 

 

 

Просто писать по кругу одни и теже вещи мне уже надоело.  :)

 

 

UDP. Опечатачка :)

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


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

  1) Привлечь большое число разработчиков к осуждению.

во-во. Посадить (забанить) всех нафиг! :biggrin:

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


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

Это в SV такие номера. В обсуждаемом V-2001 - они имеют номера 5.xx. Но написано там одно и то же.
Ясно. Постоянно заставляют прыгать со стандарта на стандарт.  :)

 

 

dxp:

Касательно очередей понимаю следубщим образом: если активные event'ы расположены либо в параллельном блоке, либо они описаны раздельно в разных блоках, то порядок выполнения не определен. Если они расположены в последовательном блоке, то будут выполняться в том порядке, в котором они расположены в исходном коде, как это и описывает параграф 9.8

 

 

 

 

во-во. Посадить (забанить) всех нафиг! :biggrin:

 

Опечатачка вышла по Фрейду.  :)

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


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

Истина одна - в языке с однократным присваиванием д/б только неблокирующее присваивание. Кстати, если использовать только неблокирующие присваивания, проще переносить алгоритмы с ЯП на HDL и обратно.

:bb-offtopic: Перевел подпрограмму(пока не программу целиком) N-ферзей с Паскаля на Верилог - записи похожие, проверю/отлажу - выложу. Сейчас задача у меня - выработать стиль написания на Паскале/Верилоге, чтобы легко м/б переносить алгоритмы в обе стороны. Синтез дает ~2K LUT, быстродействие сопоставимо с ~10ГГц x86.

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

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


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

Возможно, понятнее от этого не станет, но лично мне было бы интересно узнать взгляд на этот вопрос des00

когда я курил стандарты на V/SV у меня сложилось трактование стандарта как у SM, поэтому не вижу смысла вмешиваться, правда иногда сложно удержаться %)

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


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

Господа, как то не ожидал от вас такого. reg это тип переменной языка Verilog, никакого отношения к синтезу регистра не имеющий.

А что, где-то было указано обратное?

 

Если A состоит из этапов A1 и A2, является ли A1 частью A? Мой ответ - да. Ваш, как я понял, нет.

Если запись значения в переменную (на каком-нибудь процессоре) порождает чтение операнда из памяти, то является ли это чтение частью записи? Мой ответ - нет, т.к. это побочный эффект операции. Побочный эффект - это сопутствующее действие, но это не часть причины, его порождающей. Надеюсь, аналогия ясна.

 

 

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

 

Нужно либо:

 

  1) Привлечь большое число разработчиков к обсуждению. Возможно, понятнее от этого не станет, но лично мне было бы интересно узнать взгляд на этот вопрос des00 и CaPpuCcino.

 

  2)  Чтобы точно узнать истину - обратиться к разработчикам стандарта. Не знаю, правда, есть ли такая возможность в принципе.

Я написал письмо в комитет. Если ответят, я тут опубликую все результаты. Надеюсь, что ответят.

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


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

Если запись значения в переменную (на каком-нибудь процессоре) порождает чтение операнда из памяти, то является ли это чтение частью записи? Мой ответ - нет, т.к. это побочный эффект операции.

 

А это 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.хх

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


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

А что, где-то было указано обратное?

ваше сообщение №229

 

Понимать его следует просто: req - это регистр, который хранит значение между последовательными проходами процедурных блоков. Только и всего.....Это понятие языка программирования, коим является верилог.

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

 

Я написал письмо в комитет. Если ответят, я тут опубликую все результаты. Надеюсь, что ответят.

подождем, интересно кто же прав %)

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


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

Если запись значения в переменную (на каком-нибудь процессоре) порождает чтение операнда из памяти, то является ли это чтение частью записи? Мой ответ - нет, т.к. это побочный эффект операции. Побочный эффект - это сопутствующее действие, но это не часть причины, его порождающей. Надеюсь, аналогия ясна.

Только тут не "порождает", а "состоит".

 

 

И если операция "запись" состоит из операции "чтение" и операции "собственно запись", то мой ответ - да, операция "чтение" часть операции "запись".

 

Нелогичность и неблагозвучность названий операций этого не изменит.

 

Я написал письмо в комитет. Если ответят, я тут опубликую все результаты. Надеюсь, что ответят. 

Если не секрет, не могли бы выложить текст письма?

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


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

Не могу скопировать текст, приведу снимок экрана. Из стандарта IEEE1364-1995.

В переводе: Регистр - абстракция для элемента хранения данных. Называется reg. Хранит значение от одного назначения до другого. Оператор назначения действует как триггер, который изменяет значение элемента хранения данных. Начальное значение - неопределено.

 

Ни в какую полемику не втягиваю. Так пишу, по инерции.

post-10362-1269526359_thumb.jpg

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

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


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

Ни в какую полемику не втягиваю. Так пишу, по инерции.

 

Ну-ну.  :rolleyes:

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


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

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

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


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

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

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

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

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

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

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

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

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

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