前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Python硬件建模——链表FIFO管理器软件建模需求技术路线选择软件建模结构模型运行流程代码实现

Python硬件建模——链表FIFO管理器软件建模需求技术路线选择软件建模结构模型运行流程代码实现

作者头像
月见樽
发布2018-04-27 14:06:45
9640
发布2018-04-27 14:06:45
举报

软件建模需求

建立一个软件模型,在事物级对硬件链表FIFO管理器的各个部分进行建模,包括:

  • RAM模型
  • 链表地址管理模型
  • 系统模型

能够模拟的行为包括:

  • 初始化
  • 外部读
  • 外部写

技术路线选择

项目

技术路线

建模语言

python 3.5

第三方库

numpy

软件建模结构

model_structure.png

平台由三个类组成:

  • hardware_link_model:对controller和initialize的建模
  • addr_manager:对addr_manager的建模,负责管理start_addr和final_addr
  • ram_model:对RAM建模,包括读和写

模型运行流程

initialize

initialize.png

write

write.png

read

read.png

代码实现

基本数据结构——结点

代码语言:javascript
复制
class node_data(object):
    """docstring for node_data"""

    def __init__(self, page_capacity_width=4):
        super(node_data, self).__init__()
        page_capacity = 2 ** page_capacity_width - 2
        self.data = np.zeros(page_capacity)
        self.next_node = 0

属性

类型

功能

data

ndarray

数据

next_node

number

下一节点地址

hardware_link_model

构造方法

属性

类型

功能

ram

class:ram_model

软件ram模型

data_addr_manager

class:addr_manager

数据FIFO管理器

empty_addr_manager

class:addr_manager

空白地址FIFO管理器

ram_cap

number

ram容量

代码语言:javascript
复制
def __init__(self, ram_cap=8):
    super(hardware_link_model, self).__init__()
    self.ram = ram_model(ram_cap)
    self.data_addr_manager = addr_manager(start=0, final=0)
    self.empty_addr_manager = addr_manager(start=0, final=2 ** ram_cap - 1)
    self.ram_cap = 2 ** ram_cap

initialize方法

初始化ram

代码语言:javascript
复制
def initializer(self):
    for i in range(self.ram_cap - 1):
        self.ram.write(i, node_data(i + 1))
    self.ram.write(self.ram_cap - 1, node_data(self.ram_cap - 1))

write方法

输入din(ndarray),将该数据插入FIFO数据链表的尾部

代码语言:javascript
复制
def write(self, din):
    # Apply for empty node A from empty FIFO
    node_addr = self.empty_addr_manager.start_addr
    # Read next node address of the node A
    next_node_addr = self.ram.read_addr(node_addr)
    self.empty_addr_manager.update_start(next_node_addr)
    # Write data in the node A
    node = node_data(node_addr)
    node.data = din
    self.ram.write(node_addr, node)
    # Append node A to data FIFO
    last_final_addr = self.data_addr_manager.final_addr
    self.ram.write_addr(last_final_addr, node_addr)
    self.data_addr_manager.update_final(node_addr)

read方法

返FIFO数据链表头部的数据

代码语言:javascript
复制
def read(self):
    # Apply for data node A from empty FIFO
    node_addr = self.data_addr_manager.start_addr
    # Read next node address of the node A
    next_node_addr = self.ram.read_addr(node_addr)
    self.data_addr_manager.update_start(next_node_addr)
    # Write next node addr of node A
    self.ram.write_addr(node_addr, node_addr)
    # Read data in the node A
    node = self.ram.read(node_addr)
    # Append node A to empty FIFO
    last_final_addr = self.empty_addr_manager.final_addr
    self.ram.write_addr(last_final_addr, node_addr)
    self.empty_addr_manager.update_final(node_addr)
    return node.data

addr manger

构造方法

代码语言:javascript
复制
def __init__(self, start, final):
    super(addr_manager, self).__init__()
    self.start_addr = start
    self.final_addr = final

updata方法

代码语言:javascript
复制
def update_start(self, data):
    self.start_addr = data
def update_final(self, data):
    self.final_addr = data

ram_model

构造方法

代码语言:javascript
复制
def __init__(self, cap):
    super(ram_model, self).__init__()
    self.data = [node_data(0) for _ in range(2 ** cap)]

读方法

代码语言:javascript
复制
def read(self, addr):
    return self.data[addr]
    
def read_addr(self, addr):
    return self.data[addr].next_node

写方法

代码语言:javascript
复制
def write(self, addr, data):
    self.data[addr] = data
    
def write_addr(self, addr, data):
    self.data[addr].next_node = data

simulation

debug函数

代码语言:javascript
复制
def fifo_debug(model, addr):
    print("this:", addr, model.ram.data[addr])
    if model.ram.read_addr(addr) != addr:
        fifo_debug(model, model.ram.read_addr(addr))
    else:
        return

随机数据写入

代码语言:javascript
复制
def ramdom_write(model):
    din = np.random.randn(2**4 - 2)
    model.write(din)
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2017.12.17 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 软件建模需求
  • 技术路线选择
  • 软件建模结构
  • 模型运行流程
    • initialize
      • write
        • read
        • 代码实现
          • 基本数据结构——结点
            • hardware_link_model
              • 构造方法
              • initialize方法
              • write方法
              • read方法
            • addr manger
              • 构造方法
              • updata方法
            • ram_model
              • 构造方法
              • 读方法
              • 写方法
            • simulation
              • debug函数
              • 随机数据写入
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档