SSD

SSD using a generic Flash and a RISC-V for processing

SSD_RISC_V

Below is a browsable image of the model.

  • For an executable version,
SSD_RISC_Vmodel <h2>TextDisplay2</h2><table border="1"><tr><td><b>Parameter</b></td><td><b>Expression</b></td><td><b>Value</b></td></tr><tr><td>Block_Documentation</td><td>Enter User Documentation Here</td><td>Enter User Documentation Here</td></tr><tr><td>rowsDisplayed</td><td>10</td><td>10</td></tr><tr><td>columnsDisplayed</td><td>40</td><td>40</td></tr><tr><td>suppressBlankLines</td><td>false</td><td>false</td></tr><tr><td>title</td><td>&nbsp;</td><td>&nbsp;</td></tr><tr><td>ViewText</td><td>false</td><td>false</td></tr><tr><td>saveText</td><td>false</td><td>false</td></tr><tr><td>fileName</td><td>Enter Filename to save text</td><td>&quot;Enter Filename to save text&quot;</td></tr><tr><td>Append_Time</td><td>true</td><td>true</td></tr></table> <h2>Read/Write</h2><table border="1"><tr><td><b>Parameter</b></td><td><b>Expression</b></td><td><b>Value</b></td></tr><tr><td>Block_Documentation</td><td>Enter User Documentation Here</td><td>Enter User Documentation Here</td></tr><tr><td>Expression_List</td><td>/* Template to enter multiple RegEx lines*/\\ninput.A_Bytes\t= 128\\ninput.A_Priority = irand(1,5)\\ninput.A_Source\t= &quot;Host&quot;\\ninput.A_Destination = &quot;SSD_1&quot;\\ninput.A_Task_Flag\t= true\\n\\nRead_Write\t= irand(1,100)\\ninput.A_Command\t= (Read_Write &lt;= 50)?&quot;Read&quot;:&quot;Write&quot;\\n\\n\\n\\n/*\\ninput.A_Command\t= &quot;Read&quot;\\n\\ninput.A_Command\t= &quot;Read&quot;\\n\\nRead_Write_Erase = irand(1,100)\\ninput.A_Command\t = (Read_Write_Erase &lt;= 40)?&quot;Read&quot;:((Read_Write_Erase &lt;= 80)?&quot;Write&quot;:&quot;Erase&quot;)\\n*/</td><td>/* Template to enter multiple RegEx lines*/\\ninput.A_Bytes\t= 128\\ninput.A_Priority = irand(1,5)\\ninput.A_Source\t= &quot;Host&quot;\\ninput.A_Destination = &quot;SSD_1&quot;\\ninput.A_Task_Flag\t= true\\n\\nRead_Write\t= irand(1,100)\\ninput.A_Command\t= (Read_Write &lt;= 50)?&quot;Read&quot;:&quot;Write&quot;\\n\\n\\n\\n/*\\ninput.A_Command\t= &quot;Read&quot;\\n\\ninput.A_Command\t= &quot;Read&quot;\\n\\nRead_Write_Erase = irand(1,100)\\ninput.A_Command\t = (Read_Write_Erase &lt;= 40)?&quot;Read&quot;:((Read_Write_Erase &lt;= 80)?&quot;Write&quot;:&quot;Erase&quot;)\\n*/</td></tr><tr><td>Output_Ports</td><td>output</td><td>&quot;output&quot;</td></tr><tr><td>Output_Values</td><td>input</td><td>&quot;input&quot;</td></tr><tr><td>Output_Conditions</td><td>true</td><td>&quot;true&quot;</td></tr></table> <h2>PowerTable</h2><table border="1"><tr><td><b>Parameter</b></td><td><b>Expression</b></td><td><b>Value</b></td></tr><tr><td>Block_Documentation</td><td>This is the Excel spreadsheet import.  The power \\ninformation is maintained here.</td><td>This is the Excel spreadsheet import.  The power \\ninformation is maintained here.</td></tr><tr><td>Manager_Name</td><td>&quot;Manager_1&quot;</td><td>&quot;Manager_1&quot;</td></tr><tr><td>fileOrURL</td><td>&nbsp;</td><td>&quot;&quot;</td></tr><tr><td>Manager_Setup</td><td>/* Power_Table.  First row contains Column Names, expressions valid for entries except Device Name.                                                 \\n                 where &quot;Scheduler_&quot; or &quot;STR_&quot; + BlockName; Processor, Bus, DRAM = Architecture_Name + &quot;_&quot; + BlockName                                                                                                                                   \\n--------Device Name-------  ---------Power States------  \t-----Operating States------  --toActive--  --Speed--  --Exist-- */\\nArchitecture_Block           Standby  Active  Wait  Idle  Sleep  Existing  OffState  OnState    t_OnOff        Mhz       Volts   ; \\nArchitecture_1_RISC_V     stdb    act    wait  idle   slp\t Standby   Standby   Active     Cycle_t       ClockRate    1.0     ; \\n\\n</td><td>/* Power_Table.  First row contains Column Names, expressions valid for entries except Device Name.                                                 \\n                 where &quot;Scheduler_&quot; or &quot;STR_&quot; + BlockName; Processor, Bus, DRAM = Architecture_Name + &quot;_&quot; + BlockName                                                                                                                                   \\n--------Device Name-------  ---------Power States------  \t-----Operating States------  --toActive--  --Speed--  --Exist-- */\\nArchitecture_Block           Standby  Active  Wait  Idle  Sleep  Existing  OffState  OnState    t_OnOff        Mhz       Volts   ; \\nArchitecture_1_RISC_V     stdb    act    wait  idle   slp\t Standby   Standby   Active     Cycle_t       ClockRate    1.0     ; \\n\\n</td></tr><tr><td>Async_State_Change</td><td>/* Async_State_Change.  First row contains Column Names, expressions valid for entries except Device Name. \\n                        where State to same State can extend a Power State                                 \\n--------Device Name-------     --Start------Expression------Next--- */\\nArchitecture_Block               State        Time          State   ; \\nArchitecture_1_RISC_V   Standby       1e-7   \t    Sleep   ;</td><td>/* Async_State_Change.  First row contains Column Names, expressions valid for entries except Device Name. \\n                        where State to same State can extend a Power State                                 \\n--------Device Name-------     --Start------Expression------Next--- */\\nArchitecture_Block               State        Time          State   ; \\nArchitecture_1_RISC_V   Standby       1e-7   \t    Sleep   ;</td></tr><tr><td>Expression_List</td><td>/* First row contains Column Names.                                \\n                                                                   \\n---------Reference--------  --------------Expression------------ */\\nName                                        Value               ; \\nCycle_t                 \t1.0E-6 / ClockRate                  \t; \\nstdb\t\t\t\t0.1*act\t\t\t\t;\\nact\t\t\t\t26.28*ClockRate\t\t\t;\\nwait\t\t\t\t0.95*act\t\t\t;\\nidle\t\t\t\t0.25*act\t\t\t;\t\t\\nslp\t\t\t\t0.02*act\t\t\t;\t</td><td>/* First row contains Column Names.                                \\n                                                                   \\n---------Reference--------  --------------Expression------------ */\\nName                                        Value               ; \\nCycle_t                 \t1.0E-6 / ClockRate                  \t; \\nstdb\t\t\t\t0.1*act\t\t\t\t;\\nact\t\t\t\t26.28*ClockRate\t\t\t;\\nwait\t\t\t\t0.95*act\t\t\t;\\nidle\t\t\t\t0.25*act\t\t\t;\t\t\\nslp\t\t\t\t0.02*act\t\t\t;\t</td></tr><tr><td>Battery_Units</td><td>Micro_Watts</td><td>Micro_Watts</td></tr><tr><td>State_Plot_Enable</td><td>false</td><td>false</td></tr></table> <h2>RISC-V SSD Controller</h2><table border="1"><tr><td><b>Parameter</b></td><td><b>Expression</b></td><td><b>Value</b></td></tr><tr><td>Block_Documentation</td><td>Enter User Documentation Here</td><td>Enter User Documentation Here</td></tr></table> <h2>SSD_Latency</h2><table border="1"><tr><td><b>Parameter</b></td><td><b>Expression</b></td><td><b>Value</b></td></tr><tr><td>Block_Documentation</td><td>Enter User Documentation Here</td><td>Enter User Documentation Here</td></tr><tr><td>fillOnWrapup</td><td>true</td><td>true</td></tr><tr><td>legend</td><td>Read Latency, Write Latency</td><td>Read Latency, Write Latency</td></tr><tr><td>startingDataset</td><td>0</td><td>0</td></tr><tr><td>fileName</td><td>Enter Filename to save plot</td><td>&quot;Enter Filename to save plot&quot;</td></tr><tr><td>viewPlot</td><td>true</td><td>true</td></tr><tr><td>savePlot</td><td>false</td><td>false</td></tr></table> <h2>SSD_OverallPower</h2><table border="1"><tr><td><b>Parameter</b></td><td><b>Expression</b></td><td><b>Value</b></td></tr><tr><td>Block_Documentation</td><td>Enter User Documentation Here</td><td>Enter User Documentation Here</td></tr><tr><td>fillOnWrapup</td><td>true</td><td>true</td></tr><tr><td>legend</td><td>Average Power</td><td>Average Power</td></tr><tr><td>startingDataset</td><td>0</td><td>0</td></tr><tr><td>fileName</td><td>Enter Filename to save plot</td><td>&quot;Enter Filename to save plot&quot;</td></tr><tr><td>viewPlot</td><td>true</td><td>true</td></tr><tr><td>savePlot</td><td>false</td><td>false</td></tr></table> <h2>Processor_Power</h2><table border="1"><tr><td><b>Parameter</b></td><td><b>Expression</b></td><td><b>Value</b></td></tr><tr><td>Block_Documentation</td><td>Enter User Documentation Here</td><td>Enter User Documentation Here</td></tr><tr><td>fillOnWrapup</td><td>true</td><td>true</td></tr><tr><td>legend</td><td>RISC_V_Power</td><td>RISC_V_Power</td></tr><tr><td>startingDataset</td><td>0</td><td>0</td></tr><tr><td>fileName</td><td>Enter Filename to save plot</td><td>&quot;Enter Filename to save plot&quot;</td></tr><tr><td>viewPlot</td><td>true</td><td>true</td></tr><tr><td>savePlot</td><td>false</td><td>false</td></tr></table> <h2>Flash</h2><table border="1"><tr><td><b>Parameter</b></td><td><b>Expression</b></td><td><b>Value</b></td></tr><tr><td>Block_Documentation</td><td>Enter User Documentation Here</td><td>Enter User Documentation Here</td></tr><tr><td>Sequence_Read_Time</td><td>20.0e-9</td><td>2.0E-8</td></tr><tr><td>Random_Read_Time</td><td>25.0e-9</td><td>2.5E-8</td></tr><tr><td>Write_Access</td><td>150.0e-9</td><td>1.5E-7</td></tr><tr><td>Arch_Setup</td><td>Arch_Setup</td><td>&quot;Architecture_1&quot;</td></tr><tr><td>Page_Size</td><td>2048</td><td>2048</td></tr><tr><td>Erase_Access</td><td>150.0e-9</td><td>1.5E-7</td></tr><tr><td>Read_Access_Time</td><td>25.0e-9</td><td>2.5E-8</td></tr><tr><td>Write_Access_Time</td><td>150.0e-9</td><td>1.5E-7</td></tr><tr><td>Erase_Access_Time</td><td>150.0e-9</td><td>1.5E-7</td></tr><tr><td>Flash_Name</td><td>&quot;SSD_1&quot;</td><td>&quot;SSD_1&quot;</td></tr><tr><td>Flash_CTRL_Name</td><td>&quot;Flash_Ctrl&quot;</td><td>&quot;Flash_Ctrl&quot;</td></tr></table> <h2>TextDisplay</h2><table border="1"><tr><td><b>Parameter</b></td><td><b>Expression</b></td><td><b>Value</b></td></tr><tr><td>Block_Documentation</td><td>Enter User Documentation Here</td><td>Enter User Documentation Here</td></tr><tr><td>rowsDisplayed</td><td>10</td><td>10</td></tr><tr><td>columnsDisplayed</td><td>40</td><td>40</td></tr><tr><td>suppressBlankLines</td><td>false</td><td>false</td></tr><tr><td>title</td><td>&nbsp;</td><td>&nbsp;</td></tr><tr><td>ViewText</td><td>false</td><td>false</td></tr><tr><td>saveText</td><td>false</td><td>false</td></tr><tr><td>fileName</td><td>Enter Filename to save text</td><td>&quot;Enter Filename to save text&quot;</td></tr><tr><td>Append_Time</td><td>true</td><td>true</td></tr></table> <h2>PCIe_Bus</h2><table border="1"><tr><td><b>Parameter</b></td><td><b>Expression</b></td><td><b>Value</b></td></tr><tr><td>Architecture_Name</td><td>&quot;Architecture_1&quot;</td><td>&quot;Architecture_1&quot;</td></tr><tr><td>Bus_Name</td><td>&quot;PCIe_1&quot;</td><td>&quot;PCIe_1&quot;</td></tr><tr><td>Number_of_Lanes</td><td>4 /* Can be an array */</td><td>4</td></tr><tr><td>Slave_Buffer</td><td>512  /* Max Bytes @ Slave */</td><td>512</td></tr><tr><td>Master_Buffer</td><td>512  /* Max Bytes @ Master */</td><td>512</td></tr><tr><td>Sim_Time</td><td>SimTime</td><td>0.007</td></tr><tr><td>_explanation</td><td>Interfaces and Buses-&gt;PCI-&gt;PCIe_Bus</td><td>Interfaces and Buses-&gt;PCI-&gt;PCIe_Bus</td></tr><tr><td>Header_Bytes</td><td>16  /* 32 Bit Mode, includes CRC Bytes */</td><td>16</td></tr><tr><td>Number_of_Ports</td><td>{12, 12}  /* Master, Endpoint  Ports */</td><td>{12, 12}</td></tr><tr><td>BER</td><td>1.0E-11</td><td>1.0E-11</td></tr><tr><td>Max_Payload_Size</td><td>64 /* Write, Read Data */</td><td>64</td></tr><tr><td>Max_Payload_Req_Size</td><td>128  /* Read Requests */</td><td>128</td></tr><tr><td>PCIe_Gen_1</td><td>250.0  /* DO NOT MODIFY */</td><td>250.0</td></tr><tr><td>PCIe_Gen_2</td><td>500.0  /* DO NOT MODIFY */</td><td>500.0</td></tr><tr><td>PCIe_Gen_3</td><td>985.6  /* DO NOT MODIFY */</td><td>985.6</td></tr><tr><td>PCIe_Gen_4</td><td>1969.2  /* DO NOT MODIFY */</td><td>1969.2</td></tr><tr><td>PCIe_MBps</td><td>PCIe_Gen_3  /* Per Lane */</td><td>985.6</td></tr><tr><td>Read_to_Write_Ratio</td><td>0.5  /* 0.0 to 1.0 */</td><td>0.5</td></tr><tr><td>Devices_Attached_to_Slaves</td><td>{{&quot;SSD_1&quot;},{&quot;Dev_2&quot;},{&quot;Dev_3&quot;},{&quot;Dev_4&quot;},{&quot;Dev_5&quot;},{&quot;Dev_6&quot;},{&quot;Dev_7&quot;},{&quot;Dev_8&quot;},{&quot;Dev_9&quot;},{&quot;Dev_10&quot;},{&quot;Dev_11&quot;},{&quot;Dev_12&quot;}}</td><td>{{&quot;SSD_1&quot;}, {&quot;Dev_2&quot;}, {&quot;Dev_3&quot;}, {&quot;Dev_4&quot;}, {&quot;Dev_5&quot;}, {&quot;Dev_6&quot;}, {&quot;Dev_7&quot;}, {&quot;Dev_8&quot;}, {&quot;Dev_9&quot;}, {&quot;Dev_10&quot;}, {&quot;Dev_11&quot;}, {&quot;Dev_12&quot;}}</td></tr><tr><td>Root_Complex_Flow_Control</td><td>{false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false}</td><td>{false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false}</td></tr><tr><td>Endpoint_Flow_Control</td><td>{false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false}</td><td>{false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false}</td></tr><tr><td>Enable_Plots</td><td>false</td><td>false</td></tr><tr><td>Bit_64_Mode</td><td>true</td><td>true</td></tr></table> <h2>NVMe</h2><table border="1"><tr><td><b>Parameter</b></td><td><b>Expression</b></td><td><b>Value</b></td></tr><tr><td>Block_Documentation</td><td>Enter User Documentation Here</td><td>Enter User Documentation Here</td></tr><tr><td>Number_Of_Cores</td><td>10</td><td>10</td></tr><tr><td>Sim_Time</td><td>SimTime</td><td>0.007</td></tr><tr><td>_hideName</td><td>true</td><td>true</td></tr><tr><td>View_Report</td><td>true</td><td>true</td></tr><tr><td>Number_Of_Stats_Samples</td><td>5</td><td>5</td></tr><tr><td>Save_Report</td><td>false</td><td>false</td></tr><tr><td>NVMe_Instance</td><td>&quot;NVMe_1&quot;</td><td>&quot;NVMe_1&quot;</td></tr><tr><td>SSD_Connected</td><td>&quot;SSD_1&quot;</td><td>&quot;SSD_1&quot;</td></tr></table> <h2>RISC-V Instruction Set</h2><table border="1"><tr><td><b>Parameter</b></td><td><b>Expression</b></td><td><b>Value</b></td></tr><tr><td>Block_Documentation</td><td>Enter User Documentation Here</td><td>Enter User Documentation Here</td></tr><tr><td>Instruction_Set_Name</td><td>&quot;MyInstructionSet&quot;</td><td>&quot;MyInstructionSet&quot;</td></tr><tr><td>_explanation</td><td>ProcessorGenerator-&gt;Instruction_Set</td><td>ProcessorGenerator-&gt;Instruction_Set</td></tr><tr><td>Instruction_Set_Text</td><td>/* Instruction Set or File Path. */\\nMnew Ra  Rb  Rc  Rd     ;   /* Label */\\nRISCV INT_1 INT_2 INT_3 FP_1\t;\\n//RISCV ALU MDU LSU FPU\t;\\n//ALU INT_1\t\t;\\n//MDU INT_2\t\t;\\n//LSU INT_3\t\t;\\n//FPU FP_1\t\t;\\n\\n\\nbegin INT_1\t\t;\\n\tADD 1\t\t;\\n\tSUB 1\t\t;\\n\tSHIFT 1\t\t;\\n\tLOGIC 1\t\t;\\n\tJMP 3\t\t;\\n\t*JMP 3\t\t;\\nend INT_1\t\t;\t\t\\n\\nbegin INT_2\t\t;\\n\tMUL 5\t\t;\\n\tDIV 2 33\t;\\n\tREM 2 33\t;\\nend INT_2\t\t;\\n\\nbegin INT_3\t\t;\\n\t#LOAD 1\t\t;\\n\t#STORE 1\t;\\n\tMOV 1\t\t;\\nend INT_3\t\t;\\n\\nbegin FP_1\t\t;\\n\tFADD 3\t\t;\\n\tFSUB 3\t\t;\\n\tFMUL 3\t\t;\\n\tFDIV 17\t\t;\\n\tFCVT 5\t\t;\\n\tFCVT_W 5\t;\\nend FP_1\t\t;</td><td>/* Instruction Set or File Path. */\\nMnew Ra  Rb  Rc  Rd     ;   /* Label */\\nRISCV INT_1 INT_2 INT_3 FP_1\t;\\n//RISCV ALU MDU LSU FPU\t;\\n//ALU INT_1\t\t;\\n//MDU INT_2\t\t;\\n//LSU INT_3\t\t;\\n//FPU FP_1\t\t;\\n\\n\\nbegin INT_1\t\t;\\n\tADD 1\t\t;\\n\tSUB 1\t\t;\\n\tSHIFT 1\t\t;\\n\tLOGIC 1\t\t;\\n\tJMP 3\t\t;\\n\t*JMP 3\t\t;\\nend INT_1\t\t;\t\t\\n\\nbegin INT_2\t\t;\\n\tMUL 5\t\t;\\n\tDIV 2 33\t;\\n\tREM 2 33\t;\\nend INT_2\t\t;\\n\\nbegin INT_3\t\t;\\n\t#LOAD 1\t\t;\\n\t#STORE 1\t;\\n\tMOV 1\t\t;\\nend INT_3\t\t;\\n\\nbegin FP_1\t\t;\\n\tFADD 3\t\t;\\n\tFSUB 3\t\t;\\n\tFMUL 3\t\t;\\n\tFDIV 17\t\t;\\n\tFCVT 5\t\t;\\n\tFCVT_W 5\t;\\nend FP_1\t\t;</td></tr><tr><td>Record_Set_Name</td><td>&quot;Record_Set_Name&quot;</td><td>&quot;Record_Set_Name&quot;</td></tr></table> <h2>ArchitectureSetup</h2><table border="1"><tr><td><b>Parameter</b></td><td><b>Expression</b></td><td><b>Value</b></td></tr><tr><td>Block_Documentation</td><td>Enter User Documentation Here</td><td>Enter User Documentation Here</td></tr><tr><td>Architecture_Name</td><td>&quot;Architecture_1&quot;</td><td>&quot;Architecture_1&quot;</td></tr><tr><td>Field_Name_Mapping</td><td>/* First row contains Column Names.                */\\nExternal_Field_Name          Internal_Field_Name   ; \\nA_Address                    A_Address             ; \\nA_Bytes                      A_Bytes               ; \\nA_Data                       A_Data                ; \\nA_IDX                        A_IDX                 ; \\nA_Instruction                A_Instruction         ; \\nA_Priority                   A_Priority            ; \\nA_Source                     A_Source              ; \\nA_Destination                A_Destination         ; \\nA_Task_ID                    A_Task_ID             ; \\nA_Time                       A_Time                ; \\n</td><td>/* First row contains Column Names.                */\\nExternal_Field_Name          Internal_Field_Name   ; \\nA_Address                    A_Address             ; \\nA_Bytes                      A_Bytes               ; \\nA_Data                       A_Data                ; \\nA_IDX                        A_IDX                 ; \\nA_Instruction                A_Instruction         ; \\nA_Priority                   A_Priority            ; \\nA_Source                     A_Source              ; \\nA_Destination                A_Destination         ; \\nA_Task_ID                    A_Task_ID             ; \\nA_Time                       A_Time                ; \\n</td></tr><tr><td>Routing_Table</td><td>\\n</td><td>\\n</td></tr><tr><td>Number_of_Samples</td><td>2</td><td>2</td></tr><tr><td>Statistics_to_Plot</td><td>&quot;SSD_1_Throughput_MBs_Max&quot;</td><td>&quot;SSD_1_Throughput_MBs_Max&quot;</td></tr><tr><td>Internal_Plot_Trace_Offset</td><td>2</td><td>2</td></tr><tr><td>Listen_to_Architecture_Options</td><td>Pipeline</td><td>Pipeline</td></tr></table> <h2>Host System</h2><table border="1"><tr><td><b>Parameter</b></td><td><b>Expression</b></td><td><b>Value</b></td></tr><tr><td>Block_Documentation</td><td>Enter User Documentation Here</td><td>Enter User Documentation Here</td></tr><tr><td>Architecture_Name</td><td>&quot;Architecture_1&quot;</td><td>&quot;Architecture_1&quot;</td></tr><tr><td>IO_Name</td><td>&quot;Host&quot;</td><td>&quot;Host&quot;</td></tr><tr><td>IO_Destination</td><td>&quot;Fld_Name_or_String&quot;</td><td>&quot;Fld_Name_or_String&quot;</td></tr><tr><td>IO_Command</td><td>&quot;Fld_Name_or_String&quot;</td><td>&quot;Fld_Name_or_String&quot;</td></tr><tr><td>IO_Instruction</td><td>&quot;Fld_Name_or_String_or_None&quot;</td><td>&quot;Fld_Name_or_String_or_None&quot;</td></tr><tr><td>IO_Bytes</td><td>&quot;Fld_Name_or_Integer&quot;</td><td>&quot;Fld_Name_or_Integer&quot;</td></tr><tr><td>IO_Priority</td><td>&quot;Fld_Name_or_Integer&quot;</td><td>&quot;Fld_Name_or_Integer&quot;</td></tr><tr><td>IO_Address</td><td>&quot;Fld_Name_or_Integer&quot;</td><td>&quot;Fld_Name_or_Integer&quot;</td></tr></table> <h2>Latency Calc</h2><table border="1"><tr><td><b>Parameter</b></td><td><b>Expression</b></td><td><b>Value</b></td></tr><tr><td>Block_Documentation</td><td>Enter User Documentation Here</td><td>Enter User Documentation Here</td></tr><tr><td>Expression_List</td><td>/* Template to enter multiple RegEx lines*/\\n\\nResult_A\t= (input.A_Command == &quot;Read&quot;)?true:false\\nResult_B\t= (input.A_Command == &quot;Write&quot;)?true:false\\nEvent_2 \t= (input.Event_ID != 2)?true:false\\nEvent_3 \t= (input.Event_ID != 3)?true:false\\nEvent_4 \t= (input.Event_ID != 4)?true:false\\n/*\\nResult_C\t= (input.A_Command == &quot;Erase&quot;)?true:false\\n*/\\n\\nLatency\t= TNow - input.TIME</td><td>/* Template to enter multiple RegEx lines*/\\n\\nResult_A\t= (input.A_Command == &quot;Read&quot;)?true:false\\nResult_B\t= (input.A_Command == &quot;Write&quot;)?true:false\\nEvent_2 \t= (input.Event_ID != 2)?true:false\\nEvent_3 \t= (input.Event_ID != 3)?true:false\\nEvent_4 \t= (input.Event_ID != 4)?true:false\\n/*\\nResult_C\t= (input.A_Command == &quot;Erase&quot;)?true:false\\n*/\\n\\nLatency\t= TNow - input.TIME</td></tr><tr><td>Output_Ports</td><td>output,output1</td><td>&quot;output,output1&quot;</td></tr><tr><td>Output_Values</td><td>Latency,Latency</td><td>&quot;Latency,Latency&quot;</td></tr><tr><td>Output_Conditions</td><td>Result_A &amp;&amp; Event_2 &amp;&amp; Event_3 &amp;&amp; Event_4, Result_B &amp;&amp; Event_2 &amp;&amp; Event_3 &amp;&amp; Event_4</td><td>&quot;Result_A &amp;&amp; Event_2 &amp;&amp; Event_3 &amp;&amp; Event_4, Result_B &amp;&amp; Event_2 &amp;&amp; Event_3 &amp;&amp; Event_4&quot;</td></tr></table> <h2>Traffic</h2><table border="1"><tr><td><b>Parameter</b></td><td><b>Expression</b></td><td><b>Value</b></td></tr><tr><td>Block_Documentation</td><td>Enter User Documentation Here</td><td>Enter User Documentation Here</td></tr><tr><td>Data_Structure_Name</td><td>&quot;Processor_DS&quot;</td><td>&quot;Processor_DS&quot;</td></tr><tr><td>Start_Time</td><td>0.0</td><td>0.0</td></tr><tr><td>Value_1</td><td>TrafficRate</td><td>3.0E-5</td></tr><tr><td>Value_2</td><td>2.0</td><td>2.0</td></tr><tr><td>Random_Seed</td><td>123457L</td><td>123457L</td></tr><tr><td>Time_Distribution</td><td>Fixed (Value_1)</td><td>Fixed (Value_1)</td></tr></table> <h2>SSD_Power</h2><table border="1"><tr><td><b>Parameter</b></td><td><b>Expression</b></td><td><b>Value</b></td></tr><tr><td>Block_Documentation</td><td>This is the Excel spreadsheet import.  The power \\ninformation is maintained here.</td><td>This is the Excel spreadsheet import.  The power \\ninformation is maintained here.</td></tr><tr><td>Manager_Name</td><td>&quot;Manager_2&quot;</td><td>&quot;Manager_2&quot;</td></tr><tr><td>fileOrURL</td><td>&nbsp;</td><td>&quot;&quot;</td></tr><tr><td>Manager_Setup</td><td>/* Power_Table.  First row contains Column Names, expressions valid for entries except Device Name.                                                 \\n                 where &quot;Scheduler_&quot; or &quot;STR_&quot; + BlockName; Processor, Bus, DRAM = Architecture_Name + &quot;_&quot; + BlockName                                                                                                                                   \\n--------Device Name-------  ---------Power States------  -----Operating States------  --toActive--  --Speed--  --Exist-- */\\nArchitecture_Block          Standby         Active       Wait      Idle        Sleep          Existing    OffState  OnState    t_OnOff       Mhz       Volts   ; \\nArchitecture_1_SSD_1        ssd_idle    ssd_write    ssd_wait  ssd_idle   ssd_slumber     Standby     Standby   Active     Cycle_t       1000.0     1.0     ; </td><td>/* Power_Table.  First row contains Column Names, expressions valid for entries except Device Name.                                                 \\n                 where &quot;Scheduler_&quot; or &quot;STR_&quot; + BlockName; Processor, Bus, DRAM = Architecture_Name + &quot;_&quot; + BlockName                                                                                                                                   \\n--------Device Name-------  ---------Power States------  -----Operating States------  --toActive--  --Speed--  --Exist-- */\\nArchitecture_Block          Standby         Active       Wait      Idle        Sleep          Existing    OffState  OnState    t_OnOff       Mhz       Volts   ; \\nArchitecture_1_SSD_1        ssd_idle    ssd_write    ssd_wait  ssd_idle   ssd_slumber     Standby     Standby   Active     Cycle_t       1000.0     1.0     ; </td></tr><tr><td>Async_State_Change</td><td>/* Async_State_Change.  First row contains Column Names, expressions valid for entries except Device Name. \\n                        where State to same State can extend a Power State                                 \\n--------Device Name-------  --Start------Expression------Next--- */\\nArchitecture_Block            State        Time          State   ; \\nArchitecture_1_SSD_1        Standby        10e-3   \t Sleep   ;</td><td>/* Async_State_Change.  First row contains Column Names, expressions valid for entries except Device Name. \\n                        where State to same State can extend a Power State                                 \\n--------Device Name-------  --Start------Expression------Next--- */\\nArchitecture_Block            State        Time          State   ; \\nArchitecture_1_SSD_1        Standby        10e-3   \t Sleep   ;</td></tr><tr><td>Expression_List</td><td>/* First row contains Column Names.                                \\n                                                                   \\n---------Reference--------  --------------Expression------------ */\\nName                                        Value               ; \\n\t\\nCycle_t                 \t\t1.0E-6 / Mhz                  \t;\\nssd_read\t\t\t\t2050\t\t\t\t;\\nssd_write\t\t\t\t3350\t\t\t\t;\\nssd_wait\t\t\t\t1000\t\t\t\t;\\nssd_idle\t\t\t\t70\t\t\t\t;\\nssd_slumber\t\t\t\t2.5\t\t\t\t;\t\\nssd_act_avg\t\t\t\t2700\t\t\t\t;\\n\t\t\t</td><td>/* First row contains Column Names.                                \\n                                                                   \\n---------Reference--------  --------------Expression------------ */\\nName                                        Value               ; \\n\t\\nCycle_t                 \t\t1.0E-6 / Mhz                  \t;\\nssd_read\t\t\t\t2050\t\t\t\t;\\nssd_write\t\t\t\t3350\t\t\t\t;\\nssd_wait\t\t\t\t1000\t\t\t\t;\\nssd_idle\t\t\t\t70\t\t\t\t;\\nssd_slumber\t\t\t\t2.5\t\t\t\t;\t\\nssd_act_avg\t\t\t\t2700\t\t\t\t;\\n\t\t\t</td></tr><tr><td>Battery_Units</td><td>Milli_Watts</td><td>Milli_Watts</td></tr><tr><td>State_Plot_Enable</td><td>false</td><td>false</td></tr></table>

This model shows VisualSim's SSD implementation using the RISC-V ISA implementation. As soon as the model opens click on the RUN button (Green) in the
toolbar at the top. You will see a bunch of windows opening. These windows show the results obtained from the simulation such as Read/Write Latency, MIPS
and Cycles-per-Instruction achieved by the Processor, and Power Consumption.

For further exploration of the model:

1) Double-Click on any block to get the specifications and parameters used for the block.

2)Some blocks, called hierarchical blocks, contain components within them. To see the working of a hierarchical block, Right-Click on the block and select "Open Block".
The hierarchical blocks present in this model are "NVMe Controller", "RISC-V SSD Controller", and "Flash".

---------------------------------------SSD Model Details---------------------------------------

A traffic block combined with an expression list produces commands for the SSD. The commands include a combination of reads and writes.

A device interface creates a data transfer medium between the traffic and the PCIe bus. It is also used to retrieve the time taken for the commands
to get executed and in turn plot the results.

The PCIe bus acts a an interface between the host system and the SSD Controller. It also plots the throughput and the latency of the data structures passing via the bus.

The requests go to the NVMe Controller from the PCIe interface. The requests are stored in a queue which is connected to the SSD module. The queue also triggers the
processor to start processing the tasks assigned.

The RISC-V Processor takes in and executes Tasks such as Address Translation, Wear-Leveling, and Error Checking. The queue is popped for every task completion
which will send the request from the Queue to the SSD.

The SSD contains user defined latency values which will be used to simulate the delay for a particular request. The SSD sends completed requests back to the Device
Interface through the PCIe for overall latency calculation and plotting of results.