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

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

Leka

А ведь на верилоге описание короче... (доверяя Вам, что все там эквивалентно - проверять не буду)

И после этого будете продолжать утверждать, что классика ЯП позволяет более коротоко и лаконично (а следовательно понятно и логично) описать ту же систему? Вы вроде как изначально доказывали противоположное утверждение... Или все же прониклись сутью языков описания аппаратуры?

 

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

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


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

SM

На Верилоге только "вызываемая подпрограмма", исполняющаяся за 1 такт клока - без кода "основной программы" с вложенными циклами и выводом результатов (не отлажено пока). А на Паскале программа целиком.

 

Исходно Паскалевский код подпрограммы был совсем другим, более лаконичным - переписал с оглядкой на последующий синтез - чтобы ручной(без препроцессора) перевод на Верилог был тривиальным. Так что в данном случае ЯП "не на своем поле".

 

А вот если перевести на синтезируемый Верилог всю программу целиком - сравнение будет явно не в пользу HDL. И сам перевод ЯП --> HDL в этом случае не тривиален. Поэтому и хочу добавить в HDL элементы ЯП.

 

module tb();
wire [31:0] count; 
wire [15:0] pos; 
reg  [15:0] N = 1; 
reg  rst = 1;
reg  clk = 0; 
queens _1(count, pos, N, rst, clk);
always  #1 clk <= ~clk;
always@(posedge clk) if ( pos == 11 ) $finish;
always@(posedge clk) if (pos == 0) $display("N=%d count=%d", N, count);
always@(posedge clk) begin
  rst <= 0;
  if(pos == 0) rst <=1;
  if(pos == 0) N <= N+1;
end
endmodule

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


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

и выводом результатов

Ну это и не главное. Так как вывод результатов в той или иной форме все же не основное, основное их получение.

 

Спасибо.

 

И сам перевод ЯП --> HDL в этом случае не тривиален. Поэтому и хочу добавить в HDL элементы ЯП.

Ну это понятно, так как основные принципы разные. А вообще очень интересная работа, и главное, что время на нее нашли...

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


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

Циклы, итерации - часто сложнее простого вывода. Для этого и хочется добавить элементы ЯП.

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


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

Для этого и хочется добавить элементы ЯП.

Ну тут уже кому что... Я вот последнее время, когда пишу код для PC/win, начинаю с нескольких CreateThread, CreateEvent и CreateMutex... Чтобы свободно себя чуствовать. :)

 

Хотя, в принципе, все это и без них реализуемо... Добавить бы в C "always @event" :) (не в C++ со всякими супермегалибами, где это якобы есть ). Чтобы по факту этого сам бы fork-ал :)

 

Везде и всегда чего-то не хватает...

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


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

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

Сообщение №229 вообще принадлежит не мне, а Leka. И речь там о совсем иных вещах. Будьте, пожалуйста, корректнее в претензиях.

 

 

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

Я там не претендовал на то, чтобы давать определения языка, только лишь хотел подчеркнуть суть, которая стоит за объектами (переменными, если угодно), объявляемыми с помощью ключевого слова reg. Чтобы максимально просто пояснить, почему этот объект объявлен со ключевым словом, производным от register.

 

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

Называть можно как угодно, суть от этого не меняется.

 

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

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

 

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

Вот это и есть самая суть разногласий. Вы считаете, что statement состоит из event'ов, а я считаю, что statement порождает их.

 

Вы поняли логику моих рассуждений, хотя и не согласны с ней, и я этому рад. Я понял логику ваших рассуждений, и она у меня, в принципе, не вызывает отторжения: если действительно выражение с неблокирующим присваиванием трактуется как состоящее из пары событий (evaluation of RHS и update LHS), а не как источник, порождающий эти события, тогда все встает на свои места

 

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

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

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


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

Сообщение №229 вообще принадлежит не мне, а Leka. И речь там о совсем иных вещах. Будьте, пожалуйста, корректнее в претензиях.

вы правы, ошибся в номере, ваш пост был №299

хорошо, не будем о терминах, будем о смысле. Подождем ответа авторов.

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


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

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

 

questasim/examples/psl/verilog/modeling/dram_controller/dram.v

  always @(negedge cas) begin
    if (wen & we) begin
      // Write the data if the write enable is asserted
      // which means we met the minimum wr pulse time
      mem[mem_addr] <= #DEL data;
    end
    wen = 0;      // Turn off the internal write enable
    oen = 0;      // Turn off the internal output enable
  end

 

questasim/examples/psl/verilog/modeling/dram_controller/dramcon_sim.v

   // Deassert the reset signal
   reset = 0;

   // Initialize the address counter
   addr_count = 0;

   // Initialize the data pattern to be written
   data_patt = `DWIDTH'h1;

   // Write a series of values to memory
   while (addr_count[`AIN] === 0) begin
     // Write to memory
     writemem(addr_count[`AIN-1:0], data_patt);

     // Increment the address counter
     addr_count <= addr_count + 1;

     // Shift the data pattern
     data_patt <= (data_patt << 1);
     data_patt[0] <= data_patt[`DWIDTH-1];

     // Wait for the data pattern to change
     #`DEL;
   end

 

questasim/examples/tutorials/verilog/automation/counter.v

always @ (posedge clk or posedge reset)
  if (reset)
     count = #tpd_reset_to_count 8'h00;
  else
     count <= #tpd_clk_to_count increment(count);

 

questasim/examples/tutorials/verilog/dataflow/set.v

  task lookup_cache;
    input [`addr_size-1:0] a;
    integer i;
    reg found;
  begin
    i = hash(a);
    found = valid_mem[i] && (a[`addr_size-1:`set_size] == atag_mem[i]);
    if (found) 
      hit_r <= #5 1'b1;
    else
      hit_r <= #5 1'b0;
  end
  endtask

 

 

и кэденс....

ius82/tools.lnx86/ovm/examples/sv/xbus/examples/xbus_tb_top.sv

  initial begin
    xi0.sig_reset <= 1'b1;
    xi0.sig_clock <= 1'b1;
    #51 xi0.sig_reset = 1'b0;
  end

 

ius82/tools.lnx86/ovm/examples/sv/xbus/sv/xbus_slave_driver.sv

    begin
      xsi.sig_error <= 1'b0;
      for (int i = 0; i < resp.size; i++)
      begin
        case (resp.read_write)
          READ : begin
            xsi.rw <= 1'b1;
            xsi.sig_data_out <= resp.data[i];
          end
          WRITE : begin
          end
        endcase
        if (resp.wait_state[i] > 0) begin
          xsi.sig_wait <= 1'b1;
          repeat (resp.wait_state[i])
            @(posedge xsi.sig_clock);
        end
        xsi.sig_wait <= 1'b0;
        @(posedge xsi.sig_clock);
        resp.data[i] = xsi.sig_data;
      end
      xsi.rw <= 1'b0;
      xsi.sig_wait  <= 1'bz;
      xsi.sig_error <= 1'bz;
    end

 

и синопсис...

vcs-mx_vA-2008.09/doc/examples/flow/atm_switch/dut/verilog_design_orig/utopia_atm_rx.v

begin: listen
   reg [53*8:1] cell;
   
   // First, wait for room in the Rx buffer
   if (((wr_ptr + 1) % Q_LENGTH) === rd_ptr) begin
      en <= #1 1'b1;
      // Wait for the rd_ptr to change
      wait (((wr_ptr + 1) % Q_LENGTH) !== rd_ptr);
      @ (posedge clk);
   end
   en <= #1 1'b0;

   // Wait for the start of the next cell
   while (soc !== 1'b1 || empty !== 1'b1) @ (posedge clk);

   // We have the first word.
   cell = data;
   
   // Now sample the next 52 consecutive non-empty
   // bytes
   repeat (52) begin
      cell = cell << 8;
      @ (posedge clk);
      while (empty !== 1'b1) @ (posedge clk);
      cell[8:1] = data;
   end

   // Put the new cell in the cell buffer
   cell_q[wr_ptr] = cell;
   wr_ptr = (wr_ptr + 1) % Q_LENGTH;
end

 

vcs-mx_vA-2008.09/doc/examples/flow/atm_switch/dut/verilog_design_orig/utopia_atm_tx.v

begin: talk
   reg [53*8:1] cell;
   
   // First, wait for a cell in the Tx buffer
   if (rd_ptr === wr_ptr) begin
      // Wait for the wr_ptr to change
      wait (rd_ptr !== wr_ptr);
      @ (posedge clk);
   end

   // Grab the cell out of the Tx buffer
   // but don't increment the rd pointer yet.
   // Only do that once the cell has been fully sent.
   cell = cell_q[rd_ptr];

   // Wait for the PHY layer to indicate it
   // can accept a cell/byte
   while (full !== 1'b1) begin
      @ (posedge clk);
   end
   
   // Indicate the start of the next cell
   soc  <= #1 1'b1;
   data <= #1 cell[424:417];
   en   <= #1 1'b0;

   // Now send the next 52 consecutive non-empty
   // bytes
   repeat (52) begin
      cell = cell << 8;
      @ (posedge clk);
      soc  <= #1 1'b0;
      while (full !== 1'b1) begin
         en   <= #1 1'b1;
         @ (posedge clk);
      end
      data <= #1 cell[424:417];
      en   <= #1 1'b0;
   end
   @ (posedge clk);
   en <= #1 1'b1; 

   // Consume the cell out of the buffer
   rd_ptr = (rd_ptr + 1) % Q_LENGTH;
end

 

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

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


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

Третий пример - самый поучительный: асинхронный сброс счетчика (заводится на выводы асинхронного сброса триггеров в логических элементах), синхронный счет (по clk). Зная устройство ПЛИС, только так и стоит делать.

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


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

Третий пример - самый поучительный: асинхронный сброс счетчика (заводится на выводы асинхронного сброса триггеров в логических элементах), синхронный счет (по clk). Зная устройство ПЛИС, только так и стоит делать.

 

ага, только не синтезируемый. По крайней мере ни квартусом, не Presto из Synopsys DC :)

А мне по красоте четвертый нравится...

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


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

ага, только не синтезируемый. По крайней мере ни квартусом, не Presto из Synopsys DC :)

А мне по красоте четвертый нравится...

Задержки не синтезируются, и сброс нужно делать нулем. Все будет синтезировано.

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


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

Все будет синтезировано.

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

 

Presto Verilog does not allow both blocking and nonblocking assignments to the same variable within an always block. The following code applies both blocking and nonblocking assignments to the same variable in one always block.

 

always @(posedge clk or negedge reset) begin

if (~ reset)

q = 1’b0;

else

q <= d;

end

 

Presto Verilog does not permit this and generates an error message.

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


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

 

Вы поняли логику моих рассуждений, хотя и не согласны с ней, и я этому рад. Я понял логику ваших рассуждений, и она у меня, в принципе, не вызывает отторжения: если действительно выражение с неблокирующим присваиванием трактуется как состоящее из пары событий (evaluation of RHS и update LHS), а не как источник, порождающий эти события, тогда все встает на свои места

 

:beer:

 

 

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

 

Буду ждать с нетерпением.  :)

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


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

Блокирующие присваивания - издержки синтаксиса. Измените синтаксис, и надобность в блокирующих присваиваниях отпадет - можно убрать эту ложку дегтя из бочки "ленивых вычислений". (В моем препроцессоре нет понятия блокирующего присваивания, все присваивания обозначаются "=", и все подразумеваются неблокирующими).

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

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


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

Блокирующие присваивания - издержки синтаксиса.

я не был бы столь категоричен, хочу напомнить что

Verilog был создан Phil Moorby и Prabhu Goel зимой 1983—1984 годов в фирме Automated Integrated Design Systems (с 1985 года Gateway Design Automation) как язык моделирования аппаратуры. В 1990 м году Gateway Design Automation была куплена Cadence Design Systems. Компания Cadence имеет права на логические симуляторы Gateway’s Verilog и Verilog-XL simulator.

просто нужно понимать что и зачем, тогда вопросы отпадут сами собой %)

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


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

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

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

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

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

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

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

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

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

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