मुझे एक एडर, प्रोग्राम काउंटर, मेमोरी, क्लॉक और टेस्ट बेंच मॉड्यूल डिजाइन करना है।
मुझे लगता है कि 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
दो बार छोड़कर अब मेरे पास शून्य से प्रारंभ होने के बाद आउट पुट प्रदर्शित करने वाले दो लूप हैं, और "हेक्स फ़ाइल पढ़ने" के बाद, मैंने इसे उद्धरणों में रखा क्योंकि किसी कारण से यह काम नहीं कर रहा है, भले ही मैंने पूर्ण पथ लिखा हो .. करता है किसी को पता है कि यह मेरी हेक्स फ़ाइल क्यों नहीं पढ़ेगा?
2 जवाब
निम्न पंक्ति text.hex
नाम की एक आउटपुट फ़ाइल बनाती है:
$writememh("text.hex",memory.mem);
इसके बजाय आपको किसी इनपुट फ़ाइल से पढ़ने के लिए $readmemh
का उपयोग करना होगा:
$readmemh("text.hex", memory.mem);
मुफ़्त IEEE Std 1800-2012, अनुभाग 21.4 किसी फ़ाइल से मेमोरी सरणी डेटा लोड करना देखें।
साथ ही, जैसा कि टिप्पणियों में बताया गया है, आपका पहला initial
ब्लॉक प्रत्येक मेमोरी लोकेशन को 0 असाइन करता है। $readmemh
का उपयोग करने वाला दूसरा initial
ब्लॉक, पहले के साथ विरोध करता है। मेरा अनुमान है कि आपको बस दूसरा ब्लॉक रखने की जरूरत है।
तो मैं उन्हें समानांतर में काम करने से कैसे रोकूं?
मैं शून्य के साथ निर्देश स्मृति को कैसे प्रारंभ करूं, फिर समानांतर में ऐसा किए बिना, मेरे टेक्स्ट.हेक्स फ़ाइल से हर उस पते को प्रारंभ करें जिसका मेरे पास मूल्य है?
और आपका क्या मतलब है कि मैं स्मृति को साफ़ करता हूँ, क्या आप उस समय की बात कर रहे हैं जब मैं स्मृति को शून्य से प्रारंभ करता हूँ?
"इसमें फ़ाइल पढ़ें" के लिए, मैंने सोचा कि यह वही है जो मैं "writememh("text.hex",memory.mem)" के साथ कर रहा हूं।
यदि आप सिंगल इनिशियल का उपयोग करते हैं तो चीजें बहुत आसान हो जाती हैं। मैं अक्सर उनके बीच देरी करके अनुभाग को विभाजित करता हूं जो:
मेरे सिमुलेशन तरंग में क्या होता है यह देखना आसान बनाता है।
सुनिश्चित करता है कि कोड वास्तव में क्रमिक रूप से निष्पादित किया गया है।
उदाहरण:
...
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 एक त्रुटि संदेश देता है क्योंकि सिमुलेटर को अक्सर फ़ाइल खोजने के लिए एक विशेष पथ की आवश्यकता होती है।
संबंधित सवाल
नए सवाल
memory
स्मृति प्रबंधन या प्रोग्रामिंग में मुद्दों के लिए इस टैग का उपयोग करें। स्मृति हार्डवेयर समस्याओं या सामान्य सॉफ़्टवेयर में त्रुटियों के बारे में प्रश्नों के लिए, https://superuser.com, या https://serverfault.com पर जाएं यदि यह एंटरप्राइज़-स्तरीय हार्डवेयर या सॉफ़्टवेयर से संबंधित है।