gpt4 book ai didi

systemc - SystemC 仿真应用程序中的问题处理信号

转载 作者:行者123 更新时间:2023-12-04 06:29:11 25 4
gpt4 key购买 nike

我正在模拟 CPU,并且正在使用高级模拟工具进行此操作。 SystemC 是用于这些目的的一个很好的资源。我正在使用两个模块:

  • 数据路径
  • 内存

  • CPU 数据路径被建模为一个独特的高级实体,但是下面的代码肯定会比任何其他解释更好:

    以下是datapath.hpp
    SC_MODULE(DataPath) {
    sc_in_clk clk;
    sc_in<bool> rst;
    ///
    /// Outgoing data from memory.
    ///
    sc_in<w32> mem_data;
    ///
    /// Memory read enable control signal.
    ///
    sc_out<sc_logic> mem_ctr_memreadenable;
    ///
    /// Memory write enable control signal.
    ///
    sc_out<sc_logic> mem_ctr_memwriteenable;
    ///
    /// Data to be written in memory.
    ///
    sc_out<w32> mem_dataw; //w32 is sc_lv<32>
    ///
    /// Address in mem to read and write.
    ///
    sc_out<memaddr> mem_addr;
    ///
    /// Program counter.
    ///
    sc_signal<w32> pc;
    ///
    /// State signal.
    ///
    sc_signal<int> cu_state;
    ///
    /// Other internal signals mapping registers' value.
    /// ...

    // Defining process functions
    ///
    /// Clock driven process to change state.
    ///
    void state_process();
    ///
    /// State driven process to apply control signals.
    ///
    void control_process();

    // Constructors
    SC_CTOR(DataPath) {
    // Defining first process
    SC_CTHREAD(state_process, clk.neg());
    reset_signal_is(this->rst, true);
    // Defining second process
    SC_METHOD(control_process);
    sensitive << (this->cu_state) << (this->rst);
    }

    // Defining general functions
    void reset_signals();
    };

    以下是datapath.cpp
    void DataPath::state_process() {
    // Useful variables
    w32 ir_value; /* Placing here IR register value */
    // Initialization phase
    this->cu_state.write(StateFetch); /* StateFetch is a constant */
    wait(); /* Wait next clock fall edge */
    // Cycling
    for (;;) {
    // Checking state
    switch (this->cu_state.read()) { // Basing on state, let's change the next one
    case StateFetch: /* FETCH */
    this->cu_state.write(StateDecode); /* Transition to DECODE */
    break;
    case StateDecode: /* DECODE */
    // Doing decode
    break;
    case StateExecR: /* EXEC R */
    // For every state, manage transition to the next state
    break;
    //...
    //...
    default: /* Possible not recognized state */
    this->cu_state.write(StateFetch); /* Come back to fetch */
    } /* switch */
    // After doing, wait for the next clock fall edge
    wait();
    } /* for */
    } /* function */

    // State driven process for managing signal assignment
    // This is a method process
    void DataPath::control_process() {
    // If reset signal is up then CU must be resetted
    if (this->rst.read()) {
    // Reset
    this->reset_signals(); /* Initializing signals */
    } else {
    // No Reset
    // Switching on state
    switch (this->cu_state.read()) {
    case StateFetch: /* FETCH */
    // Managing memory address and instruction fetch to place in IR
    this->mem_ctr_memreadenable.write(logic_sgm_1); /* Enabling memory to be read */
    this->mem_ctr_memwriteenable.write(logic_sgm_0); /* Disabling memory from being written */
    std::cout << "Entering fetch, memread=" << this->mem_ctr_memreadenable.read() << " memwrite=" << this->mem_ctr_memreadenable.read() << std::endl;
    // Here I read from memory and get the instruction with some code that you do not need to worry about because my problem occurs HERE ###
    break;
    case kCUStateDecode: /* DECODE */
    // ...
    break;
    //...
    //...
    default: /* Unrecognized */
    newpc = "00000000000000000000000000000000";
    } /* state switch */
    } /* rst if */
    } /* function */

    // Resetting signals
    void DataPath::reset_signals() {
    // Out signals
    this->mem_ctr_memreadenable.write(logic_sgm_1);
    this->mem_ctr_memwriteenable.write(logic_sgm_0);
    }

    如您所见,我们有一个处理 cpu 转换(更改状态)的时钟驱动进程和一个为 cpu 设置信号的状态驱动进程。

    我的问题是当我到达 ###我希望内存释放指令(您看不到指令,但它们是正确的,内存组件使用您可以在 hpp 文件中看到的输入和输出信号连接到数据路径)。
    内存让我 "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"因为 mem_ctr_memreadenablemem_ctr_memwriteenable都设置为 '0' .
    内存模块是为了成为即时组件而编写的。它是使用 SC_METHOD 编写的谁的 sensitive在输入信号上定义(包括读使能和写使能)。内存组件获取 "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"mem_ctr_memreadenable信号是 '0' .

    为什么是 '0' ?我重置信号并将该信号设置为 '1' .我不明白为什么我一直有 '0'为读使能信号。

    你能帮助我吗?
    谢谢你。

    最佳答案

    我不是 SystemC 专家,但它看起来可能与常见的 VHDL 问题类似,即信号在至少一个增量周期过去之前不会更新:

    this->mem_ctr_memreadenable.write(logic_sgm_1); /* Enabling memory to be read */
    this->mem_ctr_memwriteenable.write(logic_sgm_0); /* Disabling memory from being written */

    我的猜测:这两行和下一行之间没有时间流逝:
    std::cout << "Entering fetch, memread=" << this->mem_ctr_memreadenable.read() << " memwrite=" << this->mem_ctr_memreadenable.read() << std::endl;

    所以内存还没有看到读取信号的变化。顺便说一句,应该是 read() 之一附加到 mem_ctr_memwriteenable 的电话- 两者似乎都可读?

    如果你:
    wait(1, SC_NS);

    在这两点之间,它会改善问题吗?

    关于systemc - SystemC 仿真应用程序中的问题处理信号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5650664/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com