Проверка модели с помощью NuSMV

Правда ли, что в NuSMV нет таких значений, как NULL, nil, None?

И что мы не должны создавать модели процесса, потому что модели должны представлять собой электронные схемы?

Мой сценарий заключается в том, что у меня есть один разъем UART, основная память и процесс, в котором последний читает и пишет в основную память, а также читает и пишет в UART. В основной памяти есть данные с именем K, которые должны остаться прежними. Мы хотим доказать, что если процесс не записывает в K' then the value ofK`, то это равно его следующему значению.

Интересно, достаточно ли детализирована моя модель или она слишком абстрактна? Также, если я использовал правильные типы данных.

MODULE UART (proc, output, input)
VAR state : {idle, receive, transmit};
    Rx : unsigned word [ 8 ]; --vector of bytes
    Tx : unsigned word [ 8 ];
ASSIGN
    next (Rx) :=
        case
            proc = read : input; TRUE : (Rx);
        esac;
    next (Tx) :=
        case
            proc = write : output; TRUE : (Tx);
        esac;
    next (state) :=
        case
            proc = write : receive; proc = read : transmit; TRUE : idle;
        esac;
TRANS
    proc != read -> next (Rx) = Rx;
MODULE MEM (proc, input, output)
VAR K : unsigned word [ 8 ]; data : array 0 .. 7 of array 0 .. 7 of unsigned word [ 8 ];
ASSIGN
    init (data[1][0]) := K; 
    next (K) :=
        case
            output = data[1][0] : output;
            TRUE : K;
        esac;
MODULE main
VAR proc : {idle, read, write}; input : unsigned word [ 8 ]; 
    output : unsigned word [ 8 ]; 
    memory : MEM (proc, input, output); 
    uart0 : UART (proc, input, output); 
ASSIGN init (input) := memory.data[0][0]; init (output) := memory.data[0][0];
LTLSPEC G (output != memory.data[1][0]) -> G (memory.K = next (memory.K))

person Niklas R.    schedule 08.04.2017    source источник


Ответы (1)


В своем посте вы затрагиваете многие темы, я не уверен, какой из них является вашим главным вопросом.

Правда ли, что в NuSMV нет таких значений, как NULL, nil, None?

Это верно в том же смысле, что и для C. Nil — это только одно значение среди значений, разрешенных данным типом данных. Глядя на ваш пример, кажется, что вам это все равно особо не нужно, не так ли?

И что мы не должны создавать модели процесса, потому что модели должны представлять собой электронные схемы?

Нет. Вы можете представлять все, что хотите, если вам не нужно создавать динамический объект (например, malloc в C). Другой вопрос касается синхронности/конкурентности процессов. Вы по-прежнему можете моделировать асинхронные процессы, но это требует явного кодирования планировщика.

По поводу кода: не запускал, но многое выглядит подозрительно. Я бы посоветовал вам попробовать использовать команды моделирования NuSMV, чтобы увидеть, как ведет себя модель.

  • Модуль UART: вы записываете только как Rx, так и Tx. Эти значения никогда не читаются.
  • Модуль UART: я бы не советовал смешивать ASSIGN и TRANS. Это простой способ ввести взаимоблокировки в вашу модель. Более того, написанный вами ТРАНС уже входит в состав НАЗНАЧЕНИЯ
  • Модуль UART: зачем вам нужна переменная state?
  • Модуль MEM: я не понимаю, почему вы используете массив массивов, поскольку вы просматриваете только два значения. Я думаю, вы можете больше абстрагироваться от этой части. Судя по вашему неофициальному описанию, он вам не нужен.
  • ЛТЛ: Я не уверен, отражает ли объект то, что вы имеете в виду. Я бы написал: G ( proc != write -> (memory.K = next(memory.K)) )

Если у вас есть этот пример, закодированный на другом языке (например, C) или вы можете пересмотреть описание проблемы, то я могу предоставить вам дополнительную информацию.

person Marco    schedule 10.04.2017
comment
Большое спасибо за ответ. Я все еще новичок в NuSMV. Я внес изменения в программу и отправил ее на проверку кода codereview .stackexchange.com/questions/160295/ Надеюсь, я смогу получить больше информации. Ваш ответ был хорош. - person Niklas R.; 10.04.2017