मुझे एक एडर, प्रोग्राम काउंटर, मेमोरी, क्लॉक और टेस्ट बेंच मॉड्यूल डिजाइन करना है।

मुझे लगता है कि 0 के साथ प्रत्येक मेमोरी एड्रेस टेस्टबेंच से प्रारंभ करना है, फिर एक .hex फ़ाइल लोड करें जो मेरे पास है जो मेरे प्रोग्राम के समान निर्देशिका में है, स्मृति में। टेक्स्ट फ़ाइल इस तरह दिखती है:

"... ...

20042000

000d2820

0c000013

........"

मुझे टेक्स्ट.हेक्स फ़ाइल को स्मृति में लोड करने में समस्या हो रही है। यहाँ मेरा कोड है:

module testbench; //create the testbench 

    instruction_memory memory();


    integer i;


    initial begin
    for(i=0; i<2048; i = i+1) begin
    memory.mem[i] = 0;
                              end
    end

        initial begin
        $writememh("text.hex",memory.mem);
        end

    integer m;

        initial begin
        for(m=0; m<2048; m = m+1) begin
        $display(memory.mem[m]);
        $display(m);
                                  end
        end





endmodule //end the testbench

module instruction_memory(); // creating the module that 
                            //simulates the instruction //memory
    reg[31:0]mem[0:2047];


endmodule //ending the instruction memory module

module clock(); //starting the clock module

endmodule //ending the clock module

module pc(); //starting the program counter module

endmodule // ending the program counter module

module adder();

endmodule // ending the adder module

जब मैं इसे चलाता हूं, तो मेरा आउटपुट इस तरह दिखता है:

0

1

0

2

0

3

...

...

0 2047

यह "000d2820" या किसी अन्य शब्द के बजाय 0 क्यों लौटा रहा है?

तो मैंने एक काम किया है .. मैंने स्मृति को 0 के साथ प्रारंभ किया है, लेकिन मुझे इसमें फ़ाइल को पढ़ना प्रतीत नहीं होता है। मैं यह कैसे करु?

संपादित करें: यह अब मेरा कोड है:

module testbench; //create the testbench 

    instruction_memory memory();


    integer i;
        initial begin
        for(i=0; i<2048; i = i+1) begin
        memory.mem[i] = 0;
                                  end
        end


    initial begin
    #100;
    end


    integer n;

        initial begin
        for(n=0; n<2048; n = n+1) begin
        $display(memory.mem[n]);
        $display(n);
                                  end
        end


    initial begin
    #100;
    end


    initial begin
        $readmemh("C:\\Users\\19724\\Desktop\\spring2020\\DL\\programs\\program3\\text.hex",memory.mem);
    end 

    initial begin
    #100;
    end

    integer m;

        initial begin
        for(m=0; m<2048; m = m+1) begin
        $display(memory.mem[m]);
        $display(m);
                                  end
        end





endmodule //end the testbench

module instruction_memory(); // creating                                                            //the module that 
                            //simulates the instruction //memory

    reg[31:0]mem[0:2047];


endmodule //ending the instruction memory module

यह कोड उपरोक्त ^ के समान आउटपुट दोहराता है।

0

1

0

2

..

..

0

2047

दो बार छोड़कर अब मेरे पास शून्य से प्रारंभ होने के बाद आउट पुट प्रदर्शित करने वाले दो लूप हैं, और "हेक्स फ़ाइल पढ़ने" के बाद, मैंने इसे उद्धरणों में रखा क्योंकि किसी कारण से यह काम नहीं कर रहा है, भले ही मैंने पूर्ण पथ लिखा हो .. करता है किसी को पता है कि यह मेरी हेक्स फ़ाइल क्यों नहीं पढ़ेगा?

-1
Nak Leng 6 मार्च 2020, 19:29
1/ आपके पास दौड़ की स्थिति है क्योंकि आपके पास तीन प्रारंभिक खंड हैं जो सभी एक ही समय में समानांतर में काम करना शुरू कर देंगे! 2/ आप स्मृति को साफ़ करते हैं लेकिन मुझे कहीं भी ऐसा नहीं दिखता है कि आप " इसमें फ़ाइल पढ़ें"
 – 
Oldfart
6 मार्च 2020, 19:36
तो मैं उन्हें समानांतर में काम करने से कैसे रोकूं? मैं शून्य के साथ निर्देश स्मृति को कैसे प्रारंभ करूं, फिर समानांतर में ऐसा किए बिना, मेरे टेक्स्ट.हेक्स फ़ाइल से मेरे पास मूल्य वाले प्रत्येक पते को प्रारंभ करें? और आपका क्या मतलब है कि मैं स्मृति को साफ़ करता हूं, क्या आप इसका जिक्र कर रहे हैं जब मैं स्मृति को शून्य से प्रारंभ करता हूं? "इसमें फ़ाइल पढ़ें" के लिए, मैंने सोचा कि यह वही है जो मैं "writememh("text.hex",memory.mem)" के साथ कर रहा हूं।
 – 
Nak Leng
6 मार्च 2020, 19:44

2 जवाब

निम्न पंक्ति text.hex नाम की एक आउटपुट फ़ाइल बनाती है:

    $writememh("text.hex",memory.mem);

इसके बजाय आपको किसी इनपुट फ़ाइल से पढ़ने के लिए $readmemh का उपयोग करना होगा:

    $readmemh("text.hex", memory.mem);

मुफ़्त IEEE Std 1800-2012, अनुभाग 21.4 किसी फ़ाइल से मेमोरी सरणी डेटा लोड करना देखें।

साथ ही, जैसा कि टिप्पणियों में बताया गया है, आपका पहला initial ब्लॉक प्रत्येक मेमोरी लोकेशन को 0 असाइन करता है। $readmemh का उपयोग करने वाला दूसरा initial ब्लॉक, पहले के साथ विरोध करता है। मेरा अनुमान है कि आपको बस दूसरा ब्लॉक रखने की जरूरत है।

1
toolic 6 मार्च 2020, 19:46

तो मैं उन्हें समानांतर में काम करने से कैसे रोकूं?
मैं शून्य के साथ निर्देश स्मृति को कैसे प्रारंभ करूं, फिर समानांतर में ऐसा किए बिना, मेरे टेक्स्ट.हेक्स फ़ाइल से हर उस पते को प्रारंभ करें जिसका मेरे पास मूल्य है?
और आपका क्या मतलब है कि मैं स्मृति को साफ़ करता हूँ, क्या आप उस समय की बात कर रहे हैं जब मैं स्मृति को शून्य से प्रारंभ करता हूँ?
"इसमें फ़ाइल पढ़ें" के लिए, मैंने सोचा कि यह वही है जो मैं "writememh("text.hex",memory.mem)" के साथ कर रहा हूं।

यदि आप सिंगल इनिशियल का उपयोग करते हैं तो चीजें बहुत आसान हो जाती हैं। मैं अक्सर उनके बीच देरी करके अनुभाग को विभाजित करता हूं जो:

  1. मेरे सिमुलेशन तरंग में क्या होता है यह देखना आसान बनाता है।

  2. सुनिश्चित करता है कि कोड वास्तव में क्रमिक रूप से निष्पादित किया गया है।

उदाहरण:

...
initial
begin
   for(i=0; i<2048; i = i+1) begin
      memory.mem[i] = 0;

   #1000;

   $readmemh("text.hex",memory.mem);

   #1000;
   for(m=0; m<2048; m = m+1)
     $display(memory.mem[m]);

  $display(m);
end
....

यह देखने के लिए अपने सिमुलेशन लॉग की जांच करें कि क्या $readmemh एक त्रुटि संदेश देता है क्योंकि सिमुलेटर को अक्सर फ़ाइल खोजने के लिए एक विशेष पथ की आवश्यकता होती है।

1
Oldfart 6 मार्च 2020, 19:55
मुझे यह काम करने के लिए प्रतीत नहीं होता है। मैंने पूर्ण पथ $readmemh में रखा है और यह अभी भी काम नहीं करता है। मैंने अपने ओपी पर एक संपादन बनाया ..
 – 
Nak Leng
6 मार्च 2020, 20:23
मैं आपकी और मदद नहीं कर सकता। केवल एक चीज जो मैं सोच सकता हूं वह है एक ही फाइल में अलग-अलग चीजों को आजमाना: मेमोरी, $ रीडमेम और डिस्प्ले। मेमोरी को साफ़ न करें, यह सभी 'X' होंगे जो डिबगिंग में मदद कर सकते हैं यदि आप केवल शून्य पढ़ते हैं। फ़ाइल को एंड-ऑफ़-लाइन जांचें। हो सकता है कि आपका $readmem उदा। सीआर और एलएफ। फ़ाइल पथ: `\` फ़ाइल विभाजकों से सावधान रहें कुछ सिमुलेटर चाहते हैं '/' कुछ को दो से \\ एक एकल प्राप्त करने की आवश्यकता है।
 – 
Oldfart
6 मार्च 2020, 20:36