SM 0 25 марта, 2010 Опубликовано 25 марта, 2010 · Жалоба Leka А ведь на верилоге описание короче... (доверяя Вам, что все там эквивалентно - проверять не буду) И после этого будете продолжать утверждать, что классика ЯП позволяет более коротоко и лаконично (а следовательно понятно и логично) описать ту же систему? Вы вроде как изначально доказывали противоположное утверждение... Или все же прониклись сутью языков описания аппаратуры? ради интереса... дайте пожалуйста тестбенч для этого кода. Погонять на разных вариантах, и в т.ч. после синтеза. Я честно говоря думал, что все это ради потрепаться. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Leka 1 25 марта, 2010 Опубликовано 25 марта, 2010 · Жалоба 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 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SM 0 25 марта, 2010 Опубликовано 25 марта, 2010 · Жалоба и выводом результатов Ну это и не главное. Так как вывод результатов в той или иной форме все же не основное, основное их получение. Спасибо. И сам перевод ЯП --> HDL в этом случае не тривиален. Поэтому и хочу добавить в HDL элементы ЯП. Ну это понятно, так как основные принципы разные. А вообще очень интересная работа, и главное, что время на нее нашли... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Leka 1 25 марта, 2010 Опубликовано 25 марта, 2010 · Жалоба Циклы, итерации - часто сложнее простого вывода. Для этого и хочется добавить элементы ЯП. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SM 0 25 марта, 2010 Опубликовано 25 марта, 2010 · Жалоба Для этого и хочется добавить элементы ЯП. Ну тут уже кому что... Я вот последнее время, когда пишу код для PC/win, начинаю с нескольких CreateThread, CreateEvent и CreateMutex... Чтобы свободно себя чуствовать. :) Хотя, в принципе, все это и без них реализуемо... Добавить бы в C "always @event" :) (не в C++ со всякими супермегалибами, где это якобы есть ). Чтобы по факту этого сам бы fork-ал :) Везде и всегда чего-то не хватает... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dxp 65 26 марта, 2010 Опубликовано 26 марта, 2010 · Жалоба ваше сообщение №229 Сообщение №229 вообще принадлежит не мне, а Leka. И речь там о совсем иных вещах. Будьте, пожалуйста, корректнее в претензиях. хотя конечно, если у вас собственная терминология, и под словом регистр вы понимали слово переменная, Я там не претендовал на то, чтобы давать определения языка, только лишь хотел подчеркнуть суть, которая стоит за объектами (переменными, если угодно), объявляемыми с помощью ключевого слова reg. Чтобы максимально просто пояснить, почему этот объект объявлен со ключевым словом, производным от register. также как под словами язык программирования Verilog вы понимали слова язык описания аппаратуры Verilog тогда считайте что я вас не так понял. Называть можно как угодно, суть от этого не меняется. подождем, интересно кто же прав %) Меня интересует прежде всего, как оно на самом деле, а не кто прав/не прав. И хотя как не писал такой код, так и в дальнейшем не буду, мне весьма интересен механизм разбора очередности, и это единственная причина, по которой я трачу немало времени на выяснение сути. Пока не ответили, думаю, что тут придется запастись терпением. Только тут не "порождает", а "состоит". Вот это и есть самая суть разногласий. Вы считаете, что statement состоит из event'ов, а я считаю, что statement порождает их. Вы поняли логику моих рассуждений, хотя и не согласны с ней, и я этому рад. Я понял логику ваших рассуждений, и она у меня, в принципе, не вызывает отторжения: если действительно выражение с неблокирующим присваиванием трактуется как состоящее из пары событий (evaluation of RHS и update LHS), а не как источник, порождающий эти события, тогда все встает на свои места Если не секрет, не могли бы выложить текст письма? Секрета нет. Я просто хочу дождаться ответа и выложить всю переписку целиком. Скорее всего, придется подождать. Ничего особо интересного я там не написал - привел фрагмент кода, который мы тут мусолим, и спросил, гарантируется ли порядок выполнения. Там же привел и цитаты, которые публиковались в этой теме (про очередь событий, активные события и блокирующие присваивания). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
des00 25 26 марта, 2010 Опубликовано 26 марта, 2010 · Жалоба Сообщение №229 вообще принадлежит не мне, а Leka. И речь там о совсем иных вещах. Будьте, пожалуйста, корректнее в претензиях. вы правы, ошибся в номере, ваш пост был №299 хорошо, не будем о терминах, будем о смысле. Подождем ответа авторов. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SM 0 26 марта, 2010 Опубликовано 26 марта, 2010 · Жалоба так... к размышлению. О том, как ментор мешает в одном блоке 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 Учитесь у ведущих производителей средств разработки, как надо писать код. И не смотрите всякие сомнительные картинки, вводящие в заблуждение. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 26 марта, 2010 Опубликовано 26 марта, 2010 · Жалоба Третий пример - самый поучительный: асинхронный сброс счетчика (заводится на выводы асинхронного сброса триггеров в логических элементах), синхронный счет (по clk). Зная устройство ПЛИС, только так и стоит делать. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SM 0 26 марта, 2010 Опубликовано 26 марта, 2010 · Жалоба Третий пример - самый поучительный: асинхронный сброс счетчика (заводится на выводы асинхронного сброса триггеров в логических элементах), синхронный счет (по clk). Зная устройство ПЛИС, только так и стоит делать. ага, только не синтезируемый. По крайней мере ни квартусом, не Presto из Synopsys DC :) А мне по красоте четвертый нравится... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 26 марта, 2010 Опубликовано 26 марта, 2010 · Жалоба ага, только не синтезируемый. По крайней мере ни квартусом, не Presto из Synopsys DC :) А мне по красоте четвертый нравится... Задержки не синтезируются, и сброс нужно делать нулем. Все будет синтезировано. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SM 0 26 марта, 2010 Опубликовано 26 марта, 2010 · Жалоба Все будет синтезировано. опять спорите? :) Попробуйте и убедитесь. Ни квартус, ни престо категорически не разрешают в одном блоке делать разные виды присваиваний одной переменной. 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. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Des333 0 26 марта, 2010 Опубликовано 26 марта, 2010 · Жалоба Вы поняли логику моих рассуждений, хотя и не согласны с ней, и я этому рад. Я понял логику ваших рассуждений, и она у меня, в принципе, не вызывает отторжения: если действительно выражение с неблокирующим присваиванием трактуется как состоящее из пары событий (evaluation of RHS и update LHS), а не как источник, порождающий эти события, тогда все встает на свои места :beer: Секрета нет. Я просто хочу дождаться ответа и выложить всю переписку целиком. Скорее всего, придется подождать. Ничего особо интересного я там не написал - привел фрагмент кода, который мы тут мусолим, и спросил, гарантируется ли порядок выполнения. Там же привел и цитаты, которые публиковались в этой теме (про очередь событий, активные события и блокирующие присваивания). Буду ждать с нетерпением. :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Leka 1 26 марта, 2010 Опубликовано 26 марта, 2010 (изменено) · Жалоба Блокирующие присваивания - издержки синтаксиса. Измените синтаксис, и надобность в блокирующих присваиваниях отпадет - можно убрать эту ложку дегтя из бочки "ленивых вычислений". (В моем препроцессоре нет понятия блокирующего присваивания, все присваивания обозначаются "=", и все подразумеваются неблокирующими). Изменено 26 марта, 2010 пользователем Leka Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
des00 25 26 марта, 2010 Опубликовано 26 марта, 2010 · Жалоба Блокирующие присваивания - издержки синтаксиса. я не был бы столь категоричен, хочу напомнить что 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. просто нужно понимать что и зачем, тогда вопросы отпадут сами собой %) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться