Jump to content

    

MaratZuev

Свой
  • Content Count

    193
  • Joined

  • Last visited

Community Reputation

0 Обычный

About MaratZuev

  • Rank
    Частый гость
  • Birthday 10/10/1974

Контакты

  • Сайт
    http://
  • ICQ
    0

Информация

  • Город
    Москва

Recent Profile Visitors

519 profile views
  1. После долгих разборок установлено, что 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
  2. Как вариант при вашем количестве постов стать своим и решить этот и многие другие вопросы. А напрямую: 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.
  3. Всем добра! Есть код 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. Если вывожу временную диаграмму, то машина в заданный момент времени переходит, как положено (показано в максимальном приближении): Но если глянуть покрытие кода, то переход остаётся недетектированным. Почему?
  4. Всё, всем спасибо, под вечер уже биты убегают...
  5. По названию и сути это - адрес процессора
  6. `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, как задано?
  7. Всем добра. Продолжаю разбирать чужое добро и наткнулся на такой кусок кода: 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 ?
  8. Спасибо, ушёл читать. Не мною заложены. Я, лишь, провожу разбор полётов.
  9. Да, на семинаре от LRDA я как-то присутствовал: показал нашим, но они интереса не проявили. У нас есть КТ-254, плохо переведённый с DO-254 и РМ-254, чуть шире помогающий понять, что же имели в виду переводчики КТ. Но, вот, где бы было написано: бери так и делай - вот этого нет. Либо я очень плохо искал. Кстати, сам стандарт говорит, ЕМНИП, что он говорит ЧТО надо, а КАК надо - не говорит.
  10. Последние четыре предложения звучат непоследовательно: "Не нужен. Является. Нужно. Не стоит." Как, всё-таки, правильно?
  11. Спасибо, про 4-х битовое представление совсем забыл. Про шашечки: я бы с радостью поехал, если бы было бы время. Шашечки-то нарисовать не успеваем. А за неоднократное напоминание вам спасибо. Буду ещё раз премного благодарен, если в очередной раз ткнёте носом в (желательно небольшой) талмуд, который бы осветил для вашего покорного слуги покрытие комильфо.
  12. 1 Используйте блоки кода - как видите, цитирование плывёт 2 count_echo_cmp < 3'd2 - здесь, наверное, не 3 как размерность, а 2? 3 Где закрывающий else для if (ce)?
  13. Может, я чего не понимаю, но зачем автор так пишет?: 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; Я всё про покрытие кода или про то, как мне покрыть последнюю строку? Только ли исключить её из рассмотрения соответствующими прагмами?
  14. Для памяти, объявленной as usual, ничего добавлять не надо - он её показывает
  15. Главные слова. Но где их брать? Просьба ткнуть носом того, что, как думает, всё облазил, но, наверное, что-то мог проглядеть.