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

Altufm или как покрыть чёрный ящик

Всем добра!

Хотел я, было, отделаться малой кровью и исключить из рассмотрения проприетарную часть кода, но руководство решило, что крыть - так крыть.

Ну, хозяин - барин, подумал я, и бросился на амбразуру, решив, что мегафункция, которую предстояло покрыть, не семи пядей во лбу, а довольно-таки скромная.

Речь, как упомянуто в топике, про 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 не доволен:

Clipboard01.thumb.gif.cd7a76f2a3494ba8c242261b690d1b4d.gif

Вопрос: ЧЯДНТ и что делать?

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


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

Но ведь вроде как надо перебрать все возможные вариации с входными выходными портами ? Разве не так ?

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


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

13 hours ago, Flip-fl0p said:

Но ведь вроде как надо перебрать все возможные вариации с входными выходными портами ? Разве не так ?

Что под вариациями подразумевается? Я и так читаю все адреса. Или их надо не только читать, но и обрывать чтение, не дожидаясь установки готовности? Какие ещё варианты?

13 hours ago, ViKo said:

nbusy_flash сам по себе молотить будет? osc?

Они - выходы, я над ними не властен.

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


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

Как предположения:

1. IP Core умеет и в чтение и в запись. Возможно, даже при конфигурировании как readonly, часть логики, отвечающей за запись все равно присутствует;

2. Из мануала:

Quote

Even though the ALTUFM megafunction allows you to select the address widths range from 3 bits to 9 bits, the UFM block always expects a full 9 bits for the width of the address register

Из приведенного кода непонятно, действительно ли там expected 9 bits, или разярдность как-то порезана.

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


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

10 minutes ago, nice_vladi said:

1. IP Core умеет и в чтение и в запись. Возможно, даже при конфигурировании как readonly, часть логики, отвечающей за запись все равно присутствует;

Да, в этом собака могла порыться. Попробую реализовать. Спасибо.

10 minutes ago, nice_vladi said:

Из приведенного кода непонятно, действительно ли там expected 9 bits, или разярдность как-то порезана.

В исходном посте решил не приводить хидер, как (думал) несущественный, ан нет: потребовался.

Вот он: 

`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_ 

Все адреса покрываются...

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


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

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...