gpt4 book ai didi

C:函数仅在第一次迭代中工作

转载 作者:行者123 更新时间:2023-11-30 15:46:54 26 4
gpt4 key购买 nike

我正在尝试设计一个流水线CPU模拟器。代码相当复杂,至少对我来说是这样。有多个头文件和源文件。代码编译。

运行时,它在第一次迭代(时钟周期)中运行良好。但从迭代来看并非如此。经过几个小时的查找故障后,我发现了问题所在,但不知道为什么。以下功能:

MemoryAccess(ir, pc, ground, '0', instrMem); 

在instrMem中的索引“pc”处获取一条指令并将其存储在“ir”中。以下是函数中变量的声明:

typedef char bit32[33];
bit8 instrMem[4096]; /* instruction memory */
bit32 pc, ir, ground;

问题是从第二次迭代开始,“ir”的值仍然是“00000000”。我检查了instrMem,值不全为0。我还使用驱动程序功能检查了 MemoryAccess() 的工作情况。效果很好。

我不明白为什么它在第一次迭代时运行良好,但从那时起就不行了。

有人可以帮忙吗?有没有办法找出问题所在?

以下是main()函数的相关部分:

   for(cycle=0; ; cycle++) 
{
/* load IR with PC value */
printf("I am at the beginning of the cycle loop");
MemoryAccess(ir, pc, ground, '0', instrMem);

/* report fetched register values */
printf("cycle: %d, PC: %.32s (%d), IR: %.32s\n\t", cycle, pc, bit32toint(pc), ir);

/* halt check */
if (bit32toint(ir) == 0x0000003F) {
printf("\nmachine halted\n");
break;
}

/* PC + 4 data path */
RCAdder_32(pcPlus4, ground, pc, "00000000000000000000000000000100", '0');

/* jump data path */
shiftleftby2(jumpAddress, ir);
jumpAddress[0] = pcPlus4[0];
jumpAddress[1] = pcPlus4[1];
jumpAddress[2] = pcPlus4[2];
jumpAddress[3] = pcPlus4[3];

/* sign extended / shifted immediate data path */
signextend(immSignExt, &ir[16]);
shiftleftby2(immShifted, immSignExt);

/* control unit data path */
ControlUnit(ir, &ir[26], &regWrite, &regDest,
&memRead, &memWrite, &memToReg,
&jump, &branch, &aluSrc, aluOp);

/* register memory data path - read */
Mux2_5(regWriteAddr, &ir[11], &ir[16], regDest);
registerAccess(&regOut1, &regOut2, &ir[6], &ir[11], regWriteAddr, regIn, '0');

/* alu data path */
Mux2_32(aluSrcVal, regOut2, immSignExt, aluSrc);
zero = ALU(&aluOut, regOut1, aluSrcVal, aluOp);

/* branch data path */
RCAdder_32(branchAddress, ground, pcPlus4, immShifted, '0');
Mux2_32(mbranchAddress, pcPlus4, branchAddress, AND2_1(zero, branch));
Mux2_32(pc, mbranchAddress, jumpAddress, jump);

/* main memory data path */
MemoryAccess(memOut, aluOut, regOut2, memWrite, mainMem);
Mux2_32(regIn, aluOut, memOut, memToReg);

/* register memory data path - write */
registerAccess(&regOut1, &regOut2, &ir[6], &ir[11], regWriteAddr, regIn, regWrite);

/* dump register memory and signal information */
for (i=0; i < 14; i++) {
inttobitn(i, 5, tmp);
registerAccess(&regOut1, &regOut2, tmp, &ir[11], regWriteAddr, regIn, '0');
printf("R%d: %d, ", i, bit32toint(regOut1));
}
printf("\b\b\n\tbranchAddress = %.32s (%d) jumpAddress = %.32s (%d)\n",
branchAddress, bit32toint(branchAddress), jumpAddress, bit32toint(jumpAddress));
printf("\topcode = %.6s, immSignExt = %.32s (%d), immShifted = %.32s (%d), PC+4 = %.32s (%d)\n",
ir, immSignExt, bit32toint(immSignExt), immShifted, bit32toint(immShifted), pcPlus4, bit32toint(pcPlus4));
printf("\tregWrite = %c, regDest = %c, memRead = %c, memWrite = %c, memToReg = %c, jump = %c, branch = %c, aluSrc = %c, aluOp = %.3s, zero = %c\n",
regWrite, regDest, memRead, memWrite, memToReg, jump, branch, aluSrc, aluOp, zero);
getchar();
}

以下是 MemoryAccess() 函数:

void MemoryAccess(bit32 read_out, bit32 addr, bit32 write_in, signal write_enable, bit8 memory[4096]){

int address= bitntoint(12, addr);
setbit8(read_out, memory[address]);
setbit8(&read_out[8], memory[address+1]);
setbit8(&read_out[16], memory[address+2]);
setbit8(&read_out[24], memory[address+3]);

if (write_enable){
setbit8(memory[address], write_in);
setbit8(memory[address+1], &write_in[8]);
setbit8(memory[address+2], &write_in[16]);
setbit8(memory[address+3], &write_in[24]);
}

}

Setbit8(a, b) 将 b 复制到 a 中并附加 '\0'。

最佳答案

渴望发表评论:

1 显示的代码似乎没有增加pc .

2虽然你通过了'0'作为 writebel 标志,它没有按预期使用。您可能想改变

if (write_enable)

成为

if (write_enable && ('0' != (*write_enable)))

由于之前的版本memory被作为第三个参数传递的指针所引用的内容覆盖( write_in ),这可能是 0 s。

关于C:函数仅在第一次迭代中工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17916908/

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