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

Оператор disable в Verilog-е

В Verilog-е есть оператор disable, это в некотором роде аналог оператора continue из языка Си.

Убедиться в этом можно на простом примере:

`timescale 1ns/1ps
module Test();
    integer i, j;
    always
        for(i = 0; i < 8; i = i + 1)
        begin
            for(j = 0; j < 8; j = j + 1)
            begin: _j
                if(j == 5) disable _j;
                #10;
            end
        end
endmodule

Видим, что переменная j в состоянии 5 задержку в 10 единиц не имеет, т.е. #10 не выполнилась, началась новая итерация цикла:

post-78485-1528538092_thumb.png

 

Но мне, в тестбенче, нужно не начинать новую итерацию цикла, а нужно цикл завершить, нужен эквивалент оператора break. Искал - не нашёл. Стал думать, додумался до такого:

 

    always
        for(i = 0; i < 8; i = i + 1)
        begin: _i
            for(j = 0; j < 8; j = j + 1)
            begin
                if(j == 5) disable _i;
                #10;
            end
        end

post-78485-1528538163_thumb.png

Неужели, в самом деле, нет отдельного оператора для такой цели?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
Ну в SystemVerilog может быть. А в простом нету что ли?

IEEE Standard Verilog ® Hardware Description Language IEEE Std 1364-2001 -> 11. Disabling of named blocks and tasks

The disable statement provides the ability to terminate the activity associated with concurrently active procedures, while maintaining the structured nature of Verilog HDL procedural descriptions. The disable statement gives a mechanism for terminating a task before it executes all its statements, breaking from a looping statement, or skipping statements in order to continue with another iteration of a looping statement. It is useful for handling exception conditions such as hardware interrupts and global resets

-> Example 4

This example shows the disable statement being used in an equivalent way to the two statements continue and break in the C programming language.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
-> Example 4

Собственно так и сделал. Странно, конечно, что отдельного оператора нет.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
Странно, конечно, что отдельного оператора нет.

Но есть while(j != 5) и при равенстве цикл закончится...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
Но есть while(j != 5) и при равенстве цикл закончится...

Да это понятно, можно было и for(j = 0; j < 6; j = j +1) написать.

Это же простой демонстрационный пример, сам тестбенч несколько сложнее.

Изменено пользователем Jackov

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти