Lab4实验报告
5.4
1.可创建test_for_ signext.v测试文件,添加激励信号,进行行为仿真。
2.在testBench中设定不同的输入。覆盖所有不同控制的情况,多选取一些输入数据,以保证逻辑的正确。
3.打开ISim进行仿真,观察波形是否满足设计逻辑。如果有错,检查代码,重新仿真。
6
6
module register(
begin
readdata2 = regfile[readreg2];
end
always @(negedgeclock_in)
begin
if(regwrite)
regfile[writereg] = writedata;
end
endmodule
6.2 test_for_register
moduletest_for_register;
readreg1 = 0;
readreg2 = 0;
writereg = 0;
writedata = 0;
regwrite = 0;
// current time
#285;
regwrite = 1'b1;
writereg = 5'b10101;
writedata = 32'b11111111111111110000000000000000;
);
reg [31:0] memfile[63:0];
reg [31:0] readdata;
always @(memread)
begin
readdata = memfile[address];
end
always @(negedgeclock_in)
begin
if(memwrite == 1'b1)
wire [31:0] readdata;
parameter DELY = 200;
// Instantiate the Unit Under Test (UUT)
data_memoryuut (
.clock_in(clock_in),
.address(address),
.writedata(writedata),
// Inputs
regclock_in;
reg [25:21] readreg1;
reg [20:16] readreg2;
reg [4:0] writereg;
reg [31:0] writedata;
regregwrite;
// Outputs
wire [31:0] readdata1;
wire [31:0] readdata2;
确认Enable Enhanced Design Summary已勾选
5. 点击Next
6. 在New Project Wizard – Create New Source中点击Next
7. 在 New Project Wizard – Add Existing Sources中点击Next
8. 在New Project Wizard – Project Summary中点击Finish,结束建立工程
writedata = 0;
memwrite = 0;
memread = 0;
// Wait 100 ns for global reset to finish
#185;
memwrite = 1'b1;
address = 15;
writedata = 32'b11111111000000000000000000000000;
.writedata(writedata),
.readdata1(readdata1),
.readdata2(readdata2),
.regwrite(regwrite)
);
always #(DELY/2) clock_in = ~clock_in;
initial begin
clock_in = 0;
memfile[address] = writedata;
end
endmodule
6
moduletest_for_mem;
// Inputs
regclock_in;
reg [31:0] address;
reg [31:0] writedata;
regmemwrite;
regmemread;
// Outputs
// Inputs
reg [15:0] inst;
// Outputs
wire [31:0] data;
// Instantiate the Unit Under Test (UUT)
signextuut (
.inst(inst),
.data(data)
.memwrite(memwrite),
.memread(memread),
.readdata(readdata)
);
always #(DELY/2) clock_in = ~clock_in;
initial begin
// Initialize Inputs
clock_in = 0;
address = 0;
memread = 1'b0;
#250;
memread = 1'b1;
// Add stimulus here
end
endmodule
2.5 signext
modulesignext(
input [15:0] inst,
output [31:0] data
);
reg [31:0] data;
always @(inst)
3.文件类型为Verilog Test Fixture,文件名可取test_for_register
4.Associate Source中选择register,Next。
5.添加激励信号如下图,进行行为仿真。使用clock_in作为时钟输入,仿真周期自定,至少仿真3个周期,这里设为3000ns。时钟周期暂设为200ns。
#200;
writereg = 5'b01010;
writedata = 32'b00000000000000001111111111111111;
#150;
regwrite = 1'b0;
readreg1 = 5'b10101;
readreg2 = 5'b01010;
#100;
regwrite = 1'b1;
1
1.1
简单的类MIPS单周期处理器实现–寄存器与内存
1.2
1.理解CPU的寄存器与内存
1.3
本次实验将覆盖以下范围
1.ISE的使用
2.Spartan-3E实验板的使用
3.使用Verilog HDL进行逻辑设计
4.Register的实现
5.Data Memory的实现
6.有符号扩展的实现
1.4
1.本实验的逻辑设计工具为Xilinx ISE11.1。
inputclock_in,
input [25:21] readreg1,
input [20:16] readreg2,
input [4:0] writereg,
input [31:0] writedata,
output [31:0] readdata1,
output [31:0] readdata2,
// Add stimulus here
end
endmodule
6
moduledata_memory(
inputclock_in,
input [31:0] address,
input [31:0] writedata,
inputmemwrite,
inputmemread,
output [31:0] readdata
begin
if(inst[15] == 0)
assign data = {16'b0000000000000000,inst};
else
assign data = {16'b1111111111111111,inst};
end
endmodule
2.6 test_for_signext
moduletest_for_signext;
(2)负数的补码:符号位为1,其余位为该数绝对值的原码按位取反;然后整个数加1。
求-7的补码。
因为给定数是负数,则符号位为“1”。
后七位:+7的原码(0000111)→按位取反(1111000)→加1(1111001)
所以-7的补码是11111001。
带符号扩展只需要在前面补足符号即可。
5
5.3
将符号补齐
2.添加激励信号如下图,修改代码进行行为仿真。在testBench中设定不同的输入。请覆盖所有的情况,以保证逻辑的正确
3.观察波形是否满足逻辑,如果有错,检查代码,重新仿真。
4.下面给出参考样例:
5
5.1
将16位有符号数扩展为32位有符号数。
补码:
(1)正数的补码:与原码相同。
+9的补码是00001001。
inputregwrite
);
reg [31:0] readdata1;
reg [31:0] readdata2;
reg [31:0] regfile[31:0];
always @(readreg1)
begin
readdata1 = regfile[readreg1];
end
always @(readreg2)