Switch FIR from UInt -> FixedPoint

This commit is contained in:
Paul Rigge
2020-04-30 10:51:32 -07:00
parent 35cba5dfae
commit 0cc643bfdb
3 changed files with 38 additions and 18 deletions

View File

@@ -22,6 +22,8 @@ class DigitalTop(implicit p: Parameters) extends System
with icenet.CanHavePeripheryIceNIC // Enables optionally adding the IceNIC for FireSim with icenet.CanHavePeripheryIceNIC // Enables optionally adding the IceNIC for FireSim
with chipyard.example.CanHavePeripheryInitZero // Enables optionally adding the initzero example widget with chipyard.example.CanHavePeripheryInitZero // Enables optionally adding the initzero example widget
with chipyard.example.CanHavePeripheryGCD // Enables optionally adding the GCD example widget with chipyard.example.CanHavePeripheryGCD // Enables optionally adding the GCD example widget
with chipyard.example.CanHavePeripheryUIntTestFIR // Enables optionally adding the FIR example widget
with chipyard.example.CanHavePeripheryUIntStreamingPassthrough // Enables optionally adding the passthrough example widget
{ {
override lazy val module = new DigitalTopModule(this) override lazy val module = new DigitalTopModule(this)
} }

View File

@@ -3,7 +3,7 @@
package chipyard.example package chipyard.example
import chisel3._ import chisel3._
import chisel3.{Bundle, Module} import chisel3.experimental.FixedPoint
import chisel3.util._ import chisel3.util._
import dspblocks._ import dspblocks._
import dsptools.numbers._ import dsptools.numbers._
@@ -204,7 +204,11 @@ class TLGenericFIRChain[T<:Data:Ring] (genIn: T, genOut: T, coeffs: Seq[T], para
trait CanHavePeripheryUIntTestFIR extends BaseSubsystem { trait CanHavePeripheryUIntTestFIR extends BaseSubsystem {
val fir = p(GenericFIRKey) match { val fir = p(GenericFIRKey) match {
case Some(params) => { case Some(params) => {
val fir = LazyModule(new TLGenericFIRChain(UInt(8.W), UInt(12.W), Seq(1.U, 2.U, 3.U), params)) val fir = LazyModule(new TLGenericFIRChain(
genIn = FixedPoint(8.W, 3.BP),
genOut = FixedPoint(8.W, 3.BP),
coeffs = Seq(1.F(0.BP), 2.F(0.BP), 3.F(0.BP)),
params = params))
pbus.toVariableWidthSlave(Some("firWrite")) { fir.writeQueue.mem.get } pbus.toVariableWidthSlave(Some("firWrite")) { fir.writeQueue.mem.get }
pbus.toVariableWidthSlave(Some("firRead")) { fir.readQueue.mem.get } pbus.toVariableWidthSlave(Some("firRead")) { fir.readQueue.mem.get }

View File

@@ -3,6 +3,9 @@
#define PASSTHROUGH_READ 0x2100 #define PASSTHROUGH_READ 0x2100
#define PASSTHROUGH_READ_COUNT 0x2108 #define PASSTHROUGH_READ_COUNT 0x2108
#define BP 3
#define BP_SCALE ((double)(1 << BP))
#include "mmio.h" #include "mmio.h"
#include <stdio.h> #include <stdio.h>
@@ -10,14 +13,23 @@
#include <string.h> #include <string.h>
#include <stdint.h> #include <stdint.h>
uint64_t roundi(double x)
{
if (x < 0.0) {
return (uint64_t)(x - 0.5);
} else {
return (uint64_t)(x + 0.5);
}
}
int main(void) int main(void)
{ {
printf("Starting writing\n"); double test_vector[15] = {1.0, 2.0, 3.0, 4.0, 5.0, 4.0, 3.0, 2.0, 1.0, 0.5, 0.25, 0.125, 0.125};
uint32_t num_tests = 15; uint32_t num_tests = sizeof(test_vector) / sizeof(double);
uint32_t test_vector[15] = {1, 2, 3, 4, 5, 4, 3, 2, 1, 5, 4, 3, 2, 1, 2}; printf("Starting writing %d inputs\n", num_tests);
for (int i = 0; i < num_tests; i++) { for (int i = 0; i < num_tests; i++) {
reg_write64(PASSTHROUGH_WRITE, test_vector[i]); reg_write64(PASSTHROUGH_WRITE, roundi(test_vector[i] * BP_SCALE));
} }
printf("Done writing\n"); printf("Done writing\n");
@@ -29,12 +41,14 @@ int main(void)
if (rcnt != 0) { if (rcnt != 0) {
for (int i = 0; i < num_tests - 3; i++) { for (int i = 0; i < num_tests - 3; i++) {
uint32_t res = reg_read32(PASSTHROUGH_READ); uint32_t res = reg_read32(PASSTHROUGH_READ);
uint32_t expected = 3*test_vector[i] + 2*test_vector[i+1] + test_vector[i+2]; // double res = ((double)reg_read32(PASSTHROUGH_READ)) / BP_SCALE;
double expected_double = 3*test_vector[i] + 2*test_vector[i+1] + test_vector[i+2];
uint32_t expected = ((uint32_t)(expected_double * BP_SCALE + 0.5)) & 0xFF;
if (res == expected) { if (res == expected) {
printf("\n\nPass: Got %d Expected %d\n\n", res, expected); printf("\n\nPass: Got %u Expected %u\n\n", res, expected);
} else { } else {
failed = 1; failed = 1;
printf("\n\nFail: Got %d Expected %d\n\n", res, expected); printf("\n\nFail: Got %u Expected %u\n\n", res, expected);
} }
} }
} else { } else {