MaratZuev 0 23 августа, 2019 Опубликовано 23 августа, 2019 · Жалоба Доброго всем пятничного! Либо уже устал к концу недели, либо ещё что, но не могу понять в чём дело: module tb; logic clk; initial begin clk = 0; forever #10ns clk = !clk; end; task process_zone; input logic [7:0] size; output logic process_zone_end; enum {ST_ZONE_IDLE, ST_ZONE, ST_END_ZONE} state_zone; integer i; i = 0; forever @(posedge clk) begin case (state_zone) ST_ZONE_IDLE : state_zone <= ST_ZONE; ST_ZONE : state_zone <= i == size ? ST_END_ZONE : ST_ZONE; ST_END_ZONE : state_zone <= ST_END_ZONE; default : state_zone <= ST_ZONE_IDLE; endcase i = state_zone == ST_ZONE ? i + 1 : 0; process_zone_end = state_zone == ST_END_ZONE; end endtask : process_zone logic state_next_zone; initial #10ns process_zone (8'd5, state_next_zone); endmodule : tb state_next_zone остаётся в третьем состоянии, невзирая на process_zone_end: ЧЯДНТ? Проект на всякий случай также прилагаю. test.zip Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Nieve 0 23 августа, 2019 Опубликовано 23 августа, 2019 · Жалоба ST_END_ZONE: state_zone <= ST_END_ZONE; Вы не выходите из третьего состояния. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
RobFPGA 34 23 августа, 2019 Опубликовано 23 августа, 2019 · Жалоба Приветствую! А зачем вам forever в таске? forever выполняется всегда (вот бы не подумал ) без всякого условия! То есть ваш код выглядит для сима так task process_zone; ... forever begin: b_forever @(posedge clk) begin : b_posedge ... i = state_zone == ST_ZONE ? i + 1 : 0; process_zone_end = state_zone == ST_END_ZONE; end // b_posedge end // b_forever endtask : process_zone а значит вы не выходите из taska, а так как output переменные присваиваются при выходе из task то на выходе у вас нет изменения внешней переменной state_next_zone. Меняется только локальная переменная process_zone_end. Удачи! Rob. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
MaratZuev 0 24 августа, 2019 Опубликовано 24 августа, 2019 · Жалоба Спасибо, преобразовал код в следующее: module tb; logic clk; initial begin clk = 0; forever #10ns clk = !clk; end; task process_zone; input logic [7:0] size; input logic start; enum {ST_IDLE, ST_ZONE, ST_END_ZONE} state_zone; integer i; $display("%g ns task started with size = %0d", $time, size); i = 0; state_zone <= ST_ZONE; while (i <= size) @(posedge clk) begin case (state_zone) ST_IDLE : state_zone <= start ? ST_ZONE : ST_IDLE; ST_ZONE : state_zone <= i == size ? ST_END_ZONE : ST_ZONE; ST_END_ZONE : state_zone <= ST_IDLE; default : state_zone <= ST_IDLE; endcase i = i + 1; end disable process_zone; endtask : process_zone event signal; logic start; task toggle_start; start = 1'b1; #10ns start = 1'b0; endtask : toggle_start initial begin #50ns -> signal; fork toggle_start; process_zone (8'd5, start); join -> signal; end initial begin #250ns -> signal; fork toggle_start; process_zone (8'd7, start); join -> signal; end endmodule : tb Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться