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

MaratZuev

Свой
  • Постов

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

  • Посещение

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


  1. Да, и если вы, one_eight_seven, захотите что-то сказать насчёт двух аккаунтов, то, прошу, воздержитесь. Их у меня, действительно, не один, но, полагаю, что этим я ничего не нарушаю. И снова прошу: давайте по-существу.
  2. Ну, например, читать состояние полезно, если нужно сбросить машину. А так, да, обошелся тем, что заложено.
  3. После долгих разборок установлено, что ModelSim считает покрытыми только переходы, совершённые "естественным" путём, т.е. такие, которые произошли по фронту исходной тактовой частоты, а состояния, переходы между которыми "засчитываются" также должны быть "насильно не установлены". Итого: играть (устанавливать (force/release)) можно только сигналами разрешения перехода между состояниями и сигналом сброса машины, состояния же самой машины и её тактирование трогать нельзя. `timescale 1ns / 1ns `define T1ns 1 // with respect to timebase (1ns) `define T1us 1000*`T1ns module fsm_tb; logic reset; logic clk; logic a; logic we; logic [2:0] mode; logic w; logic fsm_state_stop; logic fsm_state_op1; logic fsm_state_op2; logic fsm_state_op3; logic fsm_state_finish; integer file_stop_time; integer curr_time, us, ns; fsm_dut fsm_dut(.*); initial begin clk = '0; forever #10ns clk = ~clk; end initial begin reset = '0; #5ns reset = '1; #1ns reset = '0; end initial $monitor("@%2tns fsm.state = %s", $stime, fsm_dut.fsm.name()); initial begin a = '1; we = '0; mode = '0; w = '0; #25ns @(posedge fsm_dut.clk) // stop -> op1 force fsm_dut.we = '1; force fsm_dut.mode = 3'd4; @(posedge fsm_dut.clk) // op1 -> op2 @(posedge fsm_dut.clk) // op2 -> op3 @(posedge fsm_dut.clk) // op3 -> finish force fsm_dut.w = '0; force fsm_dut.a = '1; @(posedge fsm_dut.clk) // finish -> op1 force fsm_dut.mode = 3'd0; @(posedge fsm_dut.clk) // op1 -> finish #10ns force fsm_dut.reset = '1; // finish -> stop #1ns release fsm_dut.reset; force fsm_dut.a = '0; @(posedge fsm_dut.clk) // stop -> finish force fsm_dut.a = '1; @(posedge fsm_dut.clk) // finish -> op1 #10ns force fsm_dut.reset = '1; // op1 -> stop #1ns release fsm_dut.reset; @(posedge fsm_dut.clk) // stop -> op1 force fsm_dut.we = '1; force fsm_dut.mode = 3'd4; @(posedge fsm_dut.clk) // op1 -> op2 #10ns force fsm_dut.reset = '1; // op2 -> stop #1ns release fsm_dut.reset; @(posedge fsm_dut.clk) // stop -> op1 force fsm_dut.we = '1; force fsm_dut.mode = 3'd4; @(posedge fsm_dut.clk) // op1 -> op2 @(posedge fsm_dut.clk) // op2 -> op3 #10ns force fsm_dut.reset = '1; // op3 -> stop #1ns release fsm_dut.reset; end endmodule : fsm_tb # @ 0ns fsm.state = # @ 5ns fsm.state = stop # @10ns fsm.state = op1 # @50ns fsm.state = op2 # @70ns fsm.state = op3 # @90ns fsm.state = finish # @110ns fsm.state = op1 # @130ns fsm.state = finish # @140ns fsm.state = stop # @150ns fsm.state = finish # @170ns fsm.state = op1 # @180ns fsm.state = stop # @190ns fsm.state = op1 # @210ns fsm.state = op2 # @220ns fsm.state = stop # @230ns fsm.state = op1 # @250ns fsm.state = op2 # @270ns fsm.state = op3 # @280ns fsm.state = stop # @290ns fsm.state = op1
  4. Как вариант при вашем количестве постов стать своим и решить этот и многие другие вопросы. А напрямую: https://www.aldec.com/en/support/resources/documentation/faq/1746 The Active-HDL Lattice Edition license is distributed and controlled by Lattice Semiconductor. Active-HDL Lattice Edition is part of the Lattice ispLEVER or Lattice Diamond installation and it requires Lattice software to be installed in order for it to work properly.
  5. Всем добра! Есть код module fsm_dut( input logic reset, input logic clk, input logic a, input logic we, input logic [2:0] mode, input logic w, output logic fsm_state_stop, output logic fsm_state_op1, output logic fsm_state_op2, output logic fsm_state_op3, output logic fsm_state_finish ); enum logic [2:0] {stop, op1, op2, op3, finish} fsm; always @(posedge reset or posedge clk) if (reset) fsm <= stop; else case (fsm) stop : if (a) fsm <= op1; else fsm <= finish; op1 : if (~we) fsm <= op1; else if (mode == 3'd4) fsm <= op2; else fsm <= finish; op2 : fsm <= op3; op3 : fsm <= finish; finish : if (w | ~a) fsm <= finish; else fsm <= op1; endcase assign fsm_state_stop = fsm == stop; assign fsm_state_op1 = fsm == op1; assign fsm_state_op2 = fsm == op2; assign fsm_state_op3 = fsm == op3; assign fsm_state_finish = fsm == finish; endmodule : fsm_dut И есть testbench `timescale 1ns / 10ps module fsm_tb; logic reset; logic clk; logic a; logic we; logic [2:0] mode; logic w; logic fsm_state_stop; logic fsm_state_op1; logic fsm_state_op2; logic fsm_state_op3; logic fsm_state_finish; fsm_dut fsm_dut(.*); initial begin clk = '0; forever #10ns clk = ~clk; end initial begin reset = '0; #5ns reset = '1; #10ns reset = '0; end initial begin a = '0; we = '0; mode = '0; w = '0; #25ns force fsm_dut.fsm = fsm_dut.op2; release fsm_dut.fsm; #1ns force fsm_dut.clk = '1; #1ns force fsm_dut.clk = '0; #20ns $stop; end endmodule : fsm_tb главная цель которого установить машину fsm модуля fsm_dut в состояние op2 и дёрнуть clk, по которому, судя по описанию машины в модуле fsm_dut эта машина перейдёт в состояние op3. Если вывожу временную диаграмму, то машина в заданный момент времени переходит, как положено (показано в максимальном приближении): Но если глянуть покрытие кода, то переход остаётся недетектированным. Почему?
  6. Всё, всем спасибо, под вечер уже биты убегают...
  7. `timescale 1ns / 1ns module cmp; reg [25:0] a_cpu; reg cs_cpu; reg ena; always @(negedge cs_cpu) if (a_cpu[21:0] >= 22'h0) ena <= 1'b1; else ena <= 1'b0; initial begin cs_cpu = 1'b0; forever #10 cs_cpu = ~cs_cpu; end initial begin #5 a_cpu = 25'h0000000; #20 a_cpu = 25'h3ffffff; #20 a_cpu = 25'hzzzzzzz; #20 a_cpu = 25'hxxxxxxx; end initial #100 $stop; initial $monitor("Time = %2t, a_cpu = 0x%7h, ena = b%0b", $stime, a_cpu, ena); endmodule Даёт # Time = 0, a_cpu = 0xxxxxxxx, ena = b0 # Time = 5, a_cpu = 0x0000000, ena = b0 # Time = 20, a_cpu = 0x0000000, ena = b1 # Time = 25, a_cpu = 0x1ffffff, ena = b1 # Time = 45, a_cpu = 0xZzzzzzz, ena = b1 # Time = 60, a_cpu = 0xZzzzzzz, ena = b0 # Time = 65, a_cpu = 0xXxxxxxx, ena = b0 И Да, действительно, нижняя ветвь имеет место быть хотя бы в симуляторе. Всем спасибо. Единственный вопрос: почему в строке # Time = 25, a_cpu = 0x1ffffff, ena = b1 a_cpu равен 0x1ffffff, а не 0x3ffffff, как задано?
  8. Всем добра. Продолжаю разбирать чужое добро и наткнулся на такой кусок кода: input [25:0] a_cpu; input cs_cpu; reg ena; always @(negedge cs_cpu) if (a_cpu[21:0] >= 22'h0) ena <= 1'b1; else ena <= 1'b0; Не понятно, а что: возможны варианты, когда if отработает по ветви a_cpu[21:0] < 22'h0 ?
  9. Спасибо, ушёл читать. Не мною заложены. Я, лишь, провожу разбор полётов.
  10. Да, на семинаре от LRDA я как-то присутствовал: показал нашим, но они интереса не проявили. У нас есть КТ-254, плохо переведённый с DO-254 и РМ-254, чуть шире помогающий понять, что же имели в виду переводчики КТ. Но, вот, где бы было написано: бери так и делай - вот этого нет. Либо я очень плохо искал. Кстати, сам стандарт говорит, ЕМНИП, что он говорит ЧТО надо, а КАК надо - не говорит.
  11. Последние четыре предложения звучат непоследовательно: "Не нужен. Является. Нужно. Не стоит." Как, всё-таки, правильно?
  12. Спасибо, про 4-х битовое представление совсем забыл. Про шашечки: я бы с радостью поехал, если бы было бы время. Шашечки-то нарисовать не успеваем. А за неоднократное напоминание вам спасибо. Буду ещё раз премного благодарен, если в очередной раз ткнёте носом в (желательно небольшой) талмуд, который бы осветил для вашего покорного слуги покрытие комильфо.
  13. 1 Используйте блоки кода - как видите, цитирование плывёт 2 count_echo_cmp < 3'd2 - здесь, наверное, не 3 как размерность, а 2? 3 Где закрывающий else для if (ce)?
  14. Может, я чего не понимаю, но зачем автор так пишет?: always @(posedge clk or posedge rst) if (rst) takt <= 0; else if (a[1:0]==2'b00) takt <= 1; else if (a[1:0]==2'b01) takt <= 2; else if (a[1:0]==2'b10) takt <= 3; else if (a[1:0]==2'b11) takt <= 4; else takt <= 1; Я всё про покрытие кода или про то, как мне покрыть последнюю строку? Только ли исключить её из рассмотрения соответствующими прагмами?
  15. Для памяти, объявленной as usual, ничего добавлять не надо - он её показывает
  16. Главные слова. Но где их брать? Просьба ткнуть носом того, что, как думает, всё облазил, но, наверное, что-то мог проглядеть.
  17. Рискую навлечь справедливое возмущение по поводу якобы размножающихся тем, проистекающих, вроде бы, из одного корня, но не хотелось бы сваливать в одну кучу, тем более, что всё-таки темы разные, и для этой я решения нигде не нашёл (возможно плохо искал). Моделирую всё ту же altufm, которую проинициализировал своим mif. Читаю и радуюсь считанному. Но вспоминаю, что ModelSim умеет показывать содержимое памяти: открываю соответствующую вкладку, а там - пусто. Вопрос: а где же данные? Всё, вроде бы, облазил..
  18. Да, в этом собака могла порыться. Попробую реализовать. Спасибо. В исходном посте решил не приводить хидер, как (думал) несущественный, ан нет: потребовался. Вот он: `ifndef _main_vh_ // prevent many inclusions `define _main_vh_ `define ADDR_FLASH_DIM 9 `define ADDR_FLASH_RNG [`ADDR_FLASH_DIM-1:0] `define DATA_FLASH_DIM 16 `define DATA_FLASH_RNG [`DATA_FLASH_DIM-1:0] `endif // `ifndef _main_vh_ Все адреса покрываются...
  19. Что под вариациями подразумевается? Я и так читаю все адреса. Или их надо не только читать, но и обрывать чтение, не дожидаясь установки готовности? Какие ещё варианты? Они - выходы, я над ними не властен.
  20. Всем добра! Хотел я, было, отделаться малой кровью и исключить из рассмотрения проприетарную часть кода, но руководство решило, что крыть - так крыть. Ну, хозяин - барин, подумал я, и бросился на амбразуру, решив, что мегафункция, которую предстояло покрыть, не семи пядей во лбу, а довольно-таки скромная. Речь, как упомянуто в топике, про altufm в её параллельной реинкарнации. Итого: берём простой модуль (в хедере описания констант), который инстанциирует эту мегафункцию: `include "main.vh" module main ( input logic `ADDR_FLASH_RNG addr_flash, input logic nread_flash, output logic data_valid_flash, output logic `DATA_FLASH_RNG dataout_flash, output logic nbusy_flash, output logic osc_flash ); flash flash_inst ( .addr ( addr_flash ), .nread ( nread_flash ), .data_valid ( data_valid_flash ), .dataout ( dataout_flash ), .nbusy ( nbusy_flash ), .osc ( osc_flash ) ); endmodule : main И тестбенч: `include "main.vh" `timescale 1ns / 1ps `define T1ns 1 // with respect to timebase (1ns) `define T1us 1000*`T1ns module main_tb; logic `ADDR_FLASH_RNG addr_flash; logic nread_flash; wire data_valid_flash; wire `DATA_FLASH_RNG dataout_flash; wire nbusy_flash; wire osc_flash; main main(.*); initial begin addr_flash = 0; nread_flash = 1'b1; end initial begin forever begin nread_flash = 1'b0; @ (negedge nbusy_flash); // wait for nbusy_flash falls @ (posedge nbusy_flash); // wait for flash ready nread_flash = 1'b1; addr_flash++; if (addr_flash == '0) begin // all flash is read $stop; end end end endmodule : main_tb Работаем в соответствии с документом User Flash Memory in MAX V Devices-Max V Devices Handbook, Section II, Chapter 7 Тетсбенч перебирает (читает) все адреса и на этом заканчивает свою работу. Но ModelSim не доволен: Вопрос: ЧЯДНТ и что делать?
  21. Доброго всем. Столкнулся с таким вопросом: в проекте для maxII есть ip umf. Т.к. вещь сия представляется чёрным ящиком, покрывать оную на все 100% кажется (по кр. мере на первый взгляд) неразумным, и хочется её убрать из рассмотрения. Как это правильно сделать? Прагмы //coverage off и //coverage on по непонятным мне причинам не работают. Нашёл команду coverage exclude, но вот что имею: Хидер main.vh `ifndef _main_vh_ // prevent many inclusions `define _main_vh_ `define LED_CNT_DIM 24 `define LED_CNT_RNG [`LED_CNT_DIM-1:0] `define ADDR_FLASH_DIM 9 `define ADDR_FLASH_RNG [`ADDR_FLASH_DIM-1:0] `define DATA_FLASH_DIM 16 `define DATA_FLASH_RNG [`DATA_FLASH_DIM-1:0] `endif // `ifndef _main_vh_ Главный и единственный модуль main.sv `include "main.vh" module main ( input logic res, input logic clk, output logic led, // flash inst input logic `ADDR_FLASH_RNG addr_flash, input logic nread_flash, output logic data_valid_flash, output logic `DATA_FLASH_RNG dataout_flash, output logic nbusy_flash ); logic `LED_CNT_RNG led_counter; always_ff @(posedge clk) if ( res ) led_counter <= '0; else led_counter <= led_counter + 1'b1; assign led = led_counter[`LED_CNT_DIM - 1]; // coverage off flash flash_inst ( .addr ( addr_flash ), .nread ( nread_flash ), .data_valid ( data_valid_flash ), .dataout ( dataout_flash ), .nbusy ( nbusy_flash ) ); // coverage on endmodule : main И тестбенч main_tb.sv `include "main.vh" `timescale 1ns / 1ps module main_tb; logic res; logic clk; logic led; // flash inst logic `ADDR_FLASH_RNG addr_flash; logic nread_flash; wire data_valid_flash; wire `DATA_FLASH_RNG dataout_flash; wire nbusy_flash; main main(.*); initial begin res = 1'b0; #10ns res = 1'b1; #25ns res = 1'b0; end initial begin clk = 1'b0; forever #25ns clk = ~clk; end initial begin addr_flash = 0; nread_flash = 1'b1; end endmodule : main_tb Компилю c:\MentorGraphics\modelsim64_10.6d\win64\modelsim.exe -do coverage.tcl где сам coverage.tcl выглядит так variable test_bench main_tb if {!([vsimAuth] == "ALTERA")} { # https://electronix.ru/forum/index.php?app=forums&module=forums&controller=topic&id=122907 # main window at full screen wm state . zoomed } # clear transript window of ModelSim or QuestaSim .main clear # create library if [file exists work] { vdel -all } vlib work variable FilesCompiled 0 variable ProjectDir ../../Project/Project variable TestBenchDir ../../Project/TestBench variable QuartusSimLibDir ../../Project/QuartusSimLibs # compile all source files # https://stackoverflow.com/questions/51409347/how-to-copy-or-move-multiple-files-with-same-extension variable FilesInProjectDir [glob -nocomplain $ProjectDir/*.v $ProjectDir/*.sv] if {[llength $FilesInProjectDir]} { vlog +acc $ProjectDir/*.v $ProjectDir/*.sv variable FilesCompiled 1 } # compile testbench vlog +acc +incdir+$ProjectDir $TestBenchDir/$test_bench.sv if {$FilesCompiled == 1} { variable top_module_opt $test_bench variable coverage_letters_string "sf" # optimize design append top_module_opt "_opt" vopt -L altera_ver -L lpm_ver -L sgate_ver -L altera_mf_ver -L altera_lnsim_ver -L maxii_ver +cover=$coverage_letters_string $test_bench -o $top_module_opt vsim -L altera_ver -L lpm_ver -L sgate_ver -L altera_mf_ver -L altera_lnsim_ver -L maxii_ver -L work\ -cvgperinstance -cvgzwnocollect 1 -c -coverage work.$top_module_opt source simulation_run.tcl simulation_run 1us coverage report -html $top_module_opt.ucdb -code $coverage_letters_string view instance source ColumnConfig_instance.tcl } else { puts "No files to compile found!" } После компиляции ModelSim показывает мне вот что: Т.е. подцепились непонятно откуда библиотеки 220model.v и maxii_atoms.v, причём не из закромов ModelSima, куда я транслировал все библиотеки для maxII и других, используемых мною семейств, а из внутренностей Quartus-a: и ладно бы, но я нигде не могу найти концов, откуда они подцепились?! Далее, попытка исключить из покрытия файл flash.v путём vsim -L altera_ver -L lpm_ver -L sgate_ver -L altera_mf_ver -L altera_lnsim_ver -L maxii_ver -L work\ -cvgperinstance -cvgzwnocollect 1 -c -coverage work.$top_module_opt coverage exclude -src $ProjectDir/flash.v source simulation_run.tcl simulation_run 1us вполне успешна, а вот повторение того же для упомянутых выше библиотек vsim -L altera_ver -L lpm_ver -L sgate_ver -L altera_mf_ver -L altera_lnsim_ver -L maxii_ver -L work\ -cvgperinstance -cvgzwnocollect 1 -c -coverage work.$top_module_opt coverage exclude -src $QuartusSimLibDir/maxii_atoms.v coverage exclude -src $QuartusSimLibDir/220model.v coverage exclude -src $ProjectDir/flash.v source simulation_run.tcl simulation_run 1u приводят ModelSim в непонятное состояние: Просьба высказаться..
  22. Правильный вопрос. Посыпаю голову. Недописал. Да мне уже сейчас пришло, судя по выше"скорректированному"мною коду и комментарию вашему и вопросу andrew_b )
  23. "Причесал" исходный код насколько возможно согласно воззрениям большинства: always_ff @(posedge clk_cmp or posedge RST_cmp) if (RST_cmp) count_echo_cmp <= 2'h0; else if (end_frame_cmp) if (TSR_cmp) count_echo_cmp <= 2'h0; else if (count_echo_cmp <= 2'd2) count_echo_cmp <= count_echo_cmp + 2'd1; else count_echo_cmp <= count_echo_cmp; И RTL-Viewer показал то, что требовалось: Но вот вопрос: если у меня не код, а два чёрных ящика: как мне понять, эквивалентны ли они или нет?
×
×
  • Создать...