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

id_gene

Свой
  • Постов

    317
  • Зарегистрирован

  • Посещение

Весь контент id_gene


  1. Что значит "существенно зависят" ? Напишите скрипт, искать можно будет в пределах модуля. У Novas (Debussy or Verdi) есть возможность выбрать сигнал и в меню выбрать Trace Load, Trace Drive. Покажет все соединения сигнала по всему проекту, только вот вывод будет не самый удобный для обработки, но вы сможете скопировать текст в виде, например, < 9> test_bench.DUT.the_cpu_0.d_writedata[31:0] /* results of trace load */ <L> D:\gigabit\board_KMG\TEST_PERIF\alt_uart_test\uart_test.v(1852): .cpu_0_data_master_writedata (cpu_0_data_master_writedata), <L> D:\gigabit\board_KMG\TEST_PERIF\alt_uart_test\uart_test.v(1986): .cpu_0_data_master_writedata (cpu_0_data_master_writedata), <L> D:\gigabit\board_KMG\TEST_PERIF\alt_uart_test\uart_test.v(2035): .cpu_0_data_master_writedata (cpu_0_data_master_writedata), <L> D:\gigabit\board_KMG\TEST_PERIF\alt_uart_test\uart_test.v(2078): .cpu_0_data_master_writedata (cpu_0_data_master_writedata), test_bench.DUT : 4 load pass-through(s) *<L> D:\gigabit\board_KMG\TEST_PERIF\alt_uart_test\uart_test.v(227): assign cpu_0_jtag_debug_module_writedata = cpu_0_data_master_writedata; *test_bench.DUT.the_cpu_0_jtag_debug_module : 1 load(s) *<L> D:\gigabit\board_KMG\TEST_PERIF\alt_uart_test\uart_test.v(961): assign jtag_uart_0_avalon_jtag_slave_writedata = cpu_0_data_master_writedata; *test_bench.DUT.the_jtag_uart_0_avalon_jtag_slave : 1 load(s) *<L> D:\gigabit\board_KMG\TEST_PERIF\alt_uart_test\uart_test.v(1261): assign onchip_memory_0_s1_writedata = cpu_0_data_master_writedata; *test_bench.DUT.the_onchip_memory_0_s1 : 1 load(s) *<L> D:\gigabit\board_KMG\TEST_PERIF\alt_uart_test\uart_test.v(1606): assign uart_0_s1_writedata = cpu_0_data_master_writedata; *test_bench.DUT.the_uart_0_s1 : 1 load(s) *Total : 4 load(s), 4 load pass-through(s) Тут и номера строк в файлах, и полные пути в иерархии проекта, при этом каждая строка является ссылкой, кликнув на которую вы попадете в нужное место. Для передвижения по проекту очень удобно, а вот для экспорта куда-либо (и построения дерева) хуже.
  2. Петли у вас не возникнет, если вы разнесете комбинаторные присвоения по разным блокам, а если возникнет - то это будет действительная настоящая петля, которая вам не нужна. И если вы где-то забудете значения по умолчанию - при синтезе почти наверняка появится latch. И вы это должны заметить (в смысле проверить отчеты синтезатора должны).
  3. Согласен, с задержкой я, возможно, переборщил. Дело не в количестве событий, оно одно, а просто в факте его наличия. Упростил ваш пример до следующего: always @(posedge clk) begin b = 0; b = 1; end always @(b) $display ("b'event \n"); срабатывает на каждом фронте clk. В НЦ-верилоге и моделсиме.
  4. Честно говоря, стандарт просмотрел бегло, и все что нашел: 5.2. Even Simulation Every change in a value of a net or register in the circuit being simulated, as well as the named event, is considered an update event. Processes are sensitive to update events. 5.4.1. Determinism Execution of a statements in a particular begin-end block can be suspended in favor of other processes in a model Так что явного противоречия стандарту я не вижу. согласно вашему утверждению в следующем примере на выходе не должно произойти события, и сигнал "а" не должен меняться. В момент входа в процесс a = 1; always @* begin b = c; // to trigger process a = 0; #3 a = 1; end
  5. моделировал в Modelsim 5.7 и НЦ , результаты такие же. Проблема не в версии. Отличие двух описаний на ХДЛ на первый взгляд: присвоение типа e=0; if (b==1) e=1; при b=e=1 вызывает событие на сигнале "е", а присвоение e= b ? 1 : 0; нет Данное событие взводит второй процесс. Нужно бы залезть в стандарт и почитать конкретное описание данной ситуации. полу-офф: верилог у вас интересный. Петля возникает из-за группирования независимых присвоений в блоки begin-end, так что у вас if (a==1) c=1; вызывается даже при неизменном а, но при изменении е. если бы вы вынесли все четрые сигнала просто в assign c = a; assign d = e; assign e = b; assign f = c; все было бы гладко. Это вы упростили какой-то большой рабочий верилог до примера?
  6. А я вот теперь запутался :) Если SET приходит периодически, как его задерживать на величину, большую периода прихода SET? в буфер складывать? Т.е. условно SET приходит раз в 10 тактов, а prog = 16
  7. 2 sazh: согласен полностью. Я для этого и приписал насчет нулевой задержки и комбинаторного выхода - я бы добавил мультиплексор на выходе выводя set наружу, чтобы соответствовать условиям задачи (задержке в ноль тактов). Но это уже мелочи и условия реальной задачи...
  8. согласен, поторопился - хотел триггер на выходе сэкономить не знаю зачем. Да и сброс не мешало бы добавить. Если предусмотрена задержка в ноль тактов (выход в этом же такте) - будет комбинаторный выход, в противном случае: prog : in unsigned (15 downto 0); ... signal main_counter : unsigned (15 downto 0); ... process(clk) begin if (clk'event and clk='1') then if (set='1' and (prog != (0 => '1', others => '0'))) then main_counter <= prog; elsif (main_counter /= (others => '0')) main_counter <= main_counter - '1'; end if; -- counter if (main_counter = (0 => '1', others => '0') ) then pinout <= '1'; elsif (set='1' and (prog = (0 => '1', others => '0'))) pinout <= '1'; else pinout <= '0'; end if; -- output end if; -- clk'event end process; надеюсь с типами не попутал. ps добавил еще логики для задержки в "1"
  9. Давайте я вам на верилоге напишу, а на ВХДЛ вы сами переложите. вход prog захватывается только в момент выставления set. set должен стоять минимум такт, отсчет начинается с момента снятия set reg [15:0] main_counter; always @ (posedge clk) if (set) main_counter <= prog + 1; else if (main_counter != 0) main_counter <= main_counter - 1'b1; assign pout = (main_counter == 1); не очень оптимально, но все же...
  10. ВХДЛ не моделировал, про быстродействе не скажу. на фтп лежит в паб/ фпга/ каденс/ нц-десктоп - это полный пакет, оба симулятора версии 5.30 Лицензия вроде от ЕФА генератора должна подойти (не проверял). К пользовательскому интерфейсу привыкать придется, мне лично не нравится.
  11. nc-verilog 5.00 у меня при прочих равных (верилог, на одном проекте, на одной машине, batch-mode, без генерации картинок) работает раз в пять быстрее, чем modelsim 5.7c. При герерировании waveform разница может раза в три, не меньше. Давно перешел на nc-verilog и с шестыми версиями не сравнивал.
  12. Если у вас N каналов по К бит, и вы хотите единовременно записать К-битное слово, и вычитать вы его тоже хотите за одну операцию, то читать вам придется слово шириной N*К. Тогда по маске сможете выковырять оттуда нужные данные (каждый N-ый бит). Еще вам был предложен вариант сделать на N блоках памяти. Каждый канал пишет в свой блок, а читаете вы из нужного вам блока. Либо на триггерах думать, как с самого начала вам сказал Postoroniy_V.
  13. точно, почти все это делают. пару лет назад просматривал производителей, с тех пор возможно часть продуктов ушла с рынка, а часть обновилась. к указанным монстрам могу еще добавить: Fujitsu - 10ge свитчи Infineon PLB2800, PLB2224 National DP83016 Motorola C-Port c5-> Freescale ? Paion GEP2C02 (+ switch fabric GES0016) у TI был неуправляемый (?) TNETX4090 Via Zarlink
  14. :bb-offtopic: D-Link в москве меньше $200 стоит, но все либо SX, либо LX. Если расковыряете - расскажите, что там внутре :)
  15. Про квартус не скажу, но есть такой продукт Synplicity Certify. Сам не пользовался, и не знаю никого.
  16. Местами кривоватый симулятор арифметики http://www.ecs.umass.edu/ece/koren/arith/simulator/
  17. Не хватило памяти для вашей программы. Оптимизируйте по размеру кода, но судя по примерам для printf вам все равно понадобится не менее 4кб.
  18. В программировании слаб. Обхясните следующее. Пытаюсь переложить редко-используемые функции во внешнюю медленную память. В С-программе указываю определенную секцию с помощью аттрибута, например: char *itoa(unsigned short val, char *buf int radix) __attribute__ ((section (".ddr_sdram"))); char *itoa(unsigned short value, char *buffer, int radix) { ... return buffer; } Компилятор (gcc) выдает ошибку error: itoa causes a section type conflict. Что это значит? Нигде не могу найти описание ошибки. В чем конфликт типов? Где определяются типы секций? Что нужно сделать? Спасибо.
  19. Открыла, да. Задаете параметры - и при соответствующей лицензии геренируется нормальный ХДЛ :).
  20. Попробуйте на время задержки отключить генерацию лога сигналов, она потребляет время и память. команда : nolog -r /* (доки почитайте) потом назад включите в нужный момент. Пока лог выключен - диаграммы не генерируются. Хотя на таком небольшом проекте можете и не заметить существенной разницы. И память ваша кушается, возможно, огромными WLF файлами. :) полу-офф : Моделировать не с нуля можно если вы сохраните контрольную точку проекта (checkpoint), и восстановите ее (без перекомпиляции HDL, естественно). Только вам это мало что даст, вы сможете изменить тестовые воздействия, если вы их интерактивно задаете через ПЛИ или читаете из файлов в середине моделирования.
  21. Наблюдал некоторую нестабильность работы в точках синхронизации двух клоковых доменов. То есть при переходе от одного клока к другому по ошибке не синхронизовывал какие-то сигналы -> получал неправильную работу. Пытался найти ошибки с помощью СигналТапа и вот тут начиналась неоднозначаная работа железа: то есть ошибки, то пропадают, то просто данные случайные. Вылечилось введением синхронизации сигналов, как и должно было быть изначально. Вдобавок, для забора данных в сигналтап приводил их все к клоку, на котором он работает.
  22. если вы пишите use ieee.math_real.all то у вас пакет math_real должен быть скомпилирован в библиотеку IEEE.
×
×
  • Создать...