- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Hello,
I have implemented a custom instruction for full adder (just a basic one) in verilog for NIOS II. However when my application code (C) from NIOS II tries to access the macro for the custom instruction, I see one input operand value being tried up to a strange value, 2047 (!). Any guess what might be causing the issue? I have checked almost all the sides, however I could not find the issue. I am attaching the verilog modules with this email, I have tested in Modelsim and there it works good. I am pasting the valid instructions from the file custom_add_hw.tcl below: "add_interface nios_custom_instruction_slave_0 nios_custom_instruction end set_interface_property nios_custom_instruction_slave_0 clockCycle 0https://www.alteraforum.com/forum/attachment.php?attachmentid=6957 set_interface_property nios_custom_instruction_slave_0 operands 2 set_interface_property nios_custom_instruction_slave_0 ENABLED true add_interface_port nios_custom_instruction_slave_0 clk clk Input 1 add_interface_port nios_custom_instruction_slave_0 reset reset Input 1 add_interface_port nios_custom_instruction_slave_0 dataa dataa Input 32 add_interface_port nios_custom_instruction_slave_0 datab datab Input 32 add_interface_port nios_custom_instruction_slave_0 n n Input 3 add_interface_port nios_custom_instruction_slave_0 clk_en clk_en Input 1 add_interface_port nios_custom_instruction_slave_0 start start Input 1 add_interface_port nios_custom_instruction_slave_0 done done Output 1 add_interface_port nios_custom_instruction_slave_0 result result Output 32"https://www.alteraforum.com/forum/attachment.php?attachmentid=6957 https://www.alteraforum.com/forum/attachment.php?attachmentid=6958 https://www.alteraforum.com/forum/attachment.php?attachmentid=6959 Now from the NIOS II IDE, I am trying to call the custom instruction using the macro sumOutput = ALT_CI_CUSTOM_ADD_INST(4,1,10); as shown in the attached .c file. However the output I am getting is, Hello from Nios II! The sum is 2057 which is 2047 (for dataa, I donno why) + 10 (for datab, which gets proper value). Please help me in solving this issue. Thank You, AkhilLink Copied
3 Replies
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Hello,
Can someone be of assistance to this post please? I am struck at this point in the simulation, appreciate any inputs. If the post is not clear, I can explain the scenario once again. Thank You, Akhil- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Have you simulated this to make sure it's not the custom instruction itself? i.e. do you know for sure your custom instruction is seeing n = 4, dataa = 2047, datab = 10?
Also did you read page 11 of this document? http://www.altera.com/literature/ug/ug_nios2_custom_instruction.pdf By including the clock enable, start, and done signals it is up to your custom instruction to time everything properly.- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Hello,
Sorry, it had been my fault in the verilog and the fault was with respect to the timing. Earlier, I had been trying to do the ADD operation and read the result output port in the same clock cycle which was making the module confused and I guess the dataa port had been getting unknown value (like 2047) because of that timing issue. I really appreciate for BadOmen who made me to look into the custom instruction timing diagram once again (I am just a beginner). See what I did now is having separate 'write' and 'read' instructions and added the lines of code in verilog module custom_Component.v if(write && chipselect) begin cin = 0; {cout, output_value} = writedataa + writedatab + cin; end else if((read == 1) && (chipselect == 1)) begin readdata <= output_value; end so that before reading a result port, there will be a write latency. I tried to access from the application code (in NIOS II IDE) like this: /* Write Sum */ dataa = 0XFFFFFFFF; datab = 0XFFFFFFFF; sumOutput = ALT_CI_CUSTOM_ADD_INST(1,dataa,datab); printf("\nThe result line value is %lu",sumOutput); // Expect some unknown value to print /* Read Sum */ sumOutput = ALT_CI_CUSTOM_ADD_INST(4,dataa,datab); // Expect the earlier SUM value to print printf("\nThe SUM of %lu and %lu is %lu",dataa,datab,sumOutput); And the sumOutput variable printed an expected value!. I appreciate the effort taken by forum admins to sort this out. Thank You, Akhil
Reply
Topic Options
- Subscribe to RSS Feed
- Mark Topic as New
- Mark Topic as Read
- Float this Topic for Current User
- Bookmark
- Subscribe
- Printer Friendly Page